Program Listing for File infinity.h

Return to documentation for file (symengine/symengine/infinity.h)

#ifndef SYMENGINE_INFINITY_H
#define SYMENGINE_INFINITY_H

#include <symengine/basic.h>
#include <symengine/number.h>
#include <symengine/integer.h>
#include <symengine/mul.h>

namespace SymEngine
{

class Infty : public Number
{
    RCP<const Number> _direction;

public:
    IMPLEMENT_TYPEID(SYMENGINE_INFTY)
    Infty(const RCP<const Number> &direction);
    Infty(const Infty &inf);
    static RCP<const Infty> from_direction(const RCP<const Number> &direction);
    static RCP<const Infty> from_int(const int val);

    bool is_canonical(const RCP<const Number> &num) const;
    hash_t __hash__() const;

    // Implement these
    bool __eq__(const Basic &o) const;
    int compare(const Basic &o) const;

    virtual vec_basic get_args() const
    {
        return {_direction};
    }

    inline bool is_zero() const
    {
        return false;
    }
    inline bool is_one() const
    {
        return false;
    }
    inline bool is_minus_one() const
    {
        return false;
    }

    inline virtual bool is_exact() const
    {
        return false;
    }
    // //! Get `Evaluate` singleton to evaluate numerically
    virtual Evaluate &get_eval() const;

    inline RCP<const Number> get_direction() const
    {
        return _direction;
    }

    bool is_unsigned_infinity() const;
    bool is_positive_infinity() const;
    bool is_negative_infinity() const;

    inline bool is_positive() const
    {
        return is_positive_infinity();
    }

    inline bool is_negative() const
    {
        return is_negative_infinity();
    }

    inline bool is_complex() const
    {
        return is_unsigned_infinity();
    }
    virtual RCP<const Basic> conjugate() const;

    // Think about it again
    RCP<const Number> add(const Number &other) const;
    RCP<const Number> mul(const Number &other) const;
    RCP<const Number> div(const Number &other) const;
    RCP<const Number> pow(const Number &other) const;
    RCP<const Number> rpow(const Number &other) const;
};

inline RCP<const Infty> infty(int n = 1)
{
    return make_rcp<Infty>(integer(n));
}

RCP<const Infty> infty(const RCP<const Number> &direction);

} // SymEngine
#endif