12 const std::variant<BigInt, Rational>
value_;
21 const std::variant<BigInt, Rational>&
value() const noexcept {
29 if (std::holds_alternative<Rational>(
value_)) {
30 return std::get<Rational>(
value_).hash();
32 return Rational(std::get<BigInt>(
value_)).hash();
39 std::shared_ptr<const SymbolicNode>
clone()
const override {
41 if (std::holds_alternative<BigInt>(
value_)) {
50 if (std::holds_alternative<BigInt>(
value_)) {
51 return std::get<BigInt>(
value_) == BigInt(0);
53 return std::get<Rational>(
value_) == Rational(0);
56 if (std::holds_alternative<BigInt>(
value_)) {
57 return std::get<BigInt>(
value_) == BigInt(1);
59 return std::get<Rational>(
value_) == Rational(1);
63 if (std::holds_alternative<BigInt>(
value_)) {
64 const auto&
b = std::get<BigInt>(
value_);
65 return !
b.is_negative() && !(
b == BigInt(0));
67 return std::get<Rational>(
value_) > Rational(0);
78 const std::shared_ptr<const SymbolicNode>
real_;
79 const std::shared_ptr<const SymbolicNode>
imag_;
81 ComplexNode(std::shared_ptr<const SymbolicNode>
r, std::shared_ptr<const SymbolicNode> i)
84 throw std::invalid_argument(
"ComplexNode real and imaginary parts cannot be null");
89 const std::shared_ptr<const SymbolicNode>&
real() const noexcept {
return real_; }
90 const std::shared_ptr<const SymbolicNode>&
imag() const noexcept {
return imag_; }
104 const auto& o =
static_cast<const ComplexNode&
>(other);
105 int cmp_r =
real_->compare(*o.real_);
109 return imag_->compare(*o.imag_);
114 std::shared_ptr<const SymbolicNode>
clone()
const override {
内部 AST 的所有权、节点协议、访问者契约与工厂声明。
bool is_zero() const override
int type_priority() const override
优先级介于 NumberNode 与 VariableNode 之间。
std::shared_ptr< const SymbolicNode > clone() const override
LMCAS_AST_NODE_FACTORY_FRIEND
const std::shared_ptr< const SymbolicNode > imag_
ComplexNode(std::shared_ptr< const SymbolicNode > r, std::shared_ptr< const SymbolicNode > i)
std::size_t compute_hash() const override
void accept(LMCAS::detail::SymbolicVisitor &visitor) const override
int compare_same_type(const SymbolicNode &other) const override
const std::shared_ptr< const SymbolicNode > & real() const noexcept
const std::shared_ptr< const SymbolicNode > & imag() const noexcept
const std::shared_ptr< const SymbolicNode > real_
std::size_t compute_hash() const override
void accept(LMCAS::detail::SymbolicVisitor &visitor) const override
int compare_same_type(const SymbolicNode &other) const override
const std::variant< BigInt, Rational > & value() const noexcept
NumberNode(const BigInt &v)
bool is_positive() const override
const std::variant< BigInt, Rational > value_
NumberNode(std::variant< BigInt, Rational > v)
bool is_negative_one() const
std::shared_ptr< const SymbolicNode > clone() const override
int type_priority() const override
bool is_zero() const override
bool is_number() const override
bool is_one() const override
NumberNode(const Rational &v)
LMCAS_AST_NODE_FACTORY_FRIEND
virtual void visit(const NumberNode &node)=0
std::shared_ptr< const Node > make_node(Args &&... args)
__attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_exp_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexSymbolicResult complex_trig_form_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_nth_root_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std __attribute__((visibility("default"))) ComplexRootsResult solve_complex_quadratic_checked(std std::shared_ptr< SymbolicExpr > r
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string & v
void hash_combine(std::size_t &seed, std::size_t value)
将一个哈希值混合到种子中,用于组合多个字段的哈希.