aboutsummaryrefslogblamecommitdiff
path: root/types.h
blob: f76a0ccaa02eb99e545234149449e93610b28aff (plain) (tree)


























                                


                                 















                                                                    
                                      





                                                                            
                
                                  

                                          










                                               



































































































                                                                            
                   












                                                                
                                  






















































                                                                                   
                                          

                                               




                                        





















































                                                     

                                                      
                          

                                            



                                                        
                                 












                                      
                   








                                                                         
                                          








                                                                              
                       










                                                                               
                                  






                                                                               
                                            












                                                                          

                                  


















                                                
                              






                                                                   



                            











                                               
                              






                                                                




                            





























                                            
                                        
      
                              






                                                                    




                            






















                                            

                                        
      
                              






                                                            










                            









                                  
#ifndef TYPES_H
#define TYPES_H

#include "model.h"
#include <string>
#include <list>
#include <map>
#include <vector>
#include <set>
#include <gmpxx.h>

using std::list;
using std::string;
using std::map;
using std::vector;
using std::set;

const int CLS_OPT_OBJ = 1 << 3;
const int CLS_PROM_OBJ = 1 << 9;

const int CLS_SYM_OBJ = 1 << 2;
const int CLS_NUM_OBJ = 1 << 4;
const int CLS_BOOL_OBJ = 1 << 5;
const int CLS_CHAR_OBJ = 1 << 6;
const int CLS_STR_OBJ = 1 << 7;
const int CLS_VECT_OBJ = 1 << 8;

const int CLS_CONT_OBJ = 1 << 9;
const int CLS_ENVT_OBJ = 1 << 10;

static const int NUM_LVL_COMP = 0;
static const int NUM_LVL_REAL = 1;
static const int NUM_LVL_RAT = 2;
static const int NUM_LVL_INT = 3;

typedef set<EvalObj*> EvalObjAddrHash;
typedef vector<EvalObj*> EvalObjVec;
typedef map<string, EvalObj*> Str2EvalObj;
typedef EvalObj* (*BuiltinProc)(Pair *, const string &);

class PairReprCons;
/** @class Pair
 * Pair construct, which can be used to represent a list, or further
 * more, a syntax tree
 * (car . cdr) in Scheme
 */
class Pair : public Container {/*{{{*/
    public:
        EvalObj *car;                   /**< car (as in Scheme) */
        EvalObj *cdr;                      /**< cdr (as in Scheme) */
        Pair* next;                     /**< The next branch in effect */

        Pair(EvalObj *car, EvalObj *cdr);  /**< Create a Pair (car . cdr) */
        ~Pair();
        ReprCons *get_repr_cons();
        void gc_decrement();
        void gc_trigger(EvalObj ** &tail);
};/*}}}*/

/** @class EmptyList
 * The empty list (special situation of a list)
 */
class EmptyList: public Pair {/*{{{*/
    public:
        EmptyList();
        ReprCons *get_repr_cons();
};/*}}}*/

class ReprCons {/*{{{*/
    public:
        EvalObj *ori;
        bool done;
        string repr;
        ReprCons(bool done, EvalObj *ori = NULL);
        virtual EvalObj *next(const string &prev) = 0;
};/*}}}*/

class ReprStr : public ReprCons {/*{{{*/
    public:
        ReprStr(string repr);
        EvalObj *next(const string &prev);
};/*}}}*/

class PairReprCons : public ReprCons {/*{{{*/
    private:
        int state;
        EvalObj *ptr;
    public:
        PairReprCons(Pair *ptr, EvalObj *ori);
        EvalObj *next(const string &prev);
};/*}}}*/

class VecObj;
class VectReprCons : public ReprCons {/*{{{*/
    private:
        VecObj *ptr;
        size_t idx;
    public:
        VectReprCons(VecObj *ptr, EvalObj *ori);
        EvalObj *next(const string &prev);
};