Changeset 576

Show
Ignore:
Timestamp:
06/30/08 08:26:33 (2 months ago)
Author:
weyrick
Message:

some more playing and organizing. introduce a reference type, with a boost smart_ptr

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/rphp/runtime/rphp_hash.h

    r572 r576  
    2525 
    2626// XXX placeholder 
    27 class php_hash { 
     27class phash { 
    2828    private: 
    2929        int size; 
    3030    public: 
    31         php_hash(int sizevar) : size(sizevar) { } 
     31        phash(int sizevar) : size(sizevar) { } 
    3232 
    33         php_hash(const php_hash& h) { 
     33        phash(const phash& h) { 
    3434            size = h.size; 
    3535        } 
    3636        int getSize() const { return size; } 
     37        ~phash() { std::cout << "destorying php_hash with " << size << " fake elements" << std::endl; } 
    3738 
    3839}; 
    3940 
    40 std::ostream& operator << (std::ostream& os, const rphp::php_hash& h) 
     41std::ostream& operator << (std::ostream& os, const rphp::phash& h) 
    4142{ 
    4243    return os << "php_hash" << std::endl; 
  • trunk/rphp/runtime/rphp_object.h

    r572 r576  
    2626 
    2727// XXX placeholder 
    28 class php_object { 
     28class pobject { 
    2929    private: 
    30         php_hash properties; 
     30        phash properties; 
    3131    public: 
    32         php_object() : properties(5) { } 
     32        pobject() : properties(5) { } 
    3333 
    3434}; 
    3535 
    3636 
    37 std::ostream& operator << (std::ostream& os, const rphp::php_object& h) 
     37std::ostream& operator << (std::ostream& os, const rphp::pobject& h) 
    3838{ 
    39     return os << "php_object" << std::endl; 
     39    return os << "pobject" << std::endl; 
    4040} 
    4141 
  • trunk/rphp/runtime/rphp_pvar.h

    r572 r576  
    2323#include "boost/variant.hpp" 
    2424#include "boost/lexical_cast.hpp" 
     25#include "boost/shared_ptr.hpp" 
     26 
    2527#include "unicode/unistr.h" 
     28 
    2629#include "rphp_hash.h" 
    2730#include "rphp_object.h" 
     31 
    2832#include <iostream> 
    2933 
     
    3943}; 
    4044 
     45// pvar numbers 
     46typedef long pint; 
     47typedef double pfloat; 
     48 
    4149// string types: binary and unicode flavor 
    4250typedef std::string bstring; 
     
    4452 
    4553// a variant that represents a php variable 
    46 typedef boost::variant< p3state/*int*/, long, double, bstring, ustring, php_hash, php_object> pvar; 
     54typedef boost::variant< p3state/*int*/, pint/*long*/, pfloat/*double*/, bstring, ustring, phash, pobject> pvarBase; 
     55 
     56// reference to a pvar_base 
     57typedef boost::shared_ptr<pvarBase> pvarRef; 
     58 
     59// full pvar definition: a variant that can hold a base type or reference 
     60typedef boost::variant< p3state/*int*/, pint/*long*/, pfloat/*double*/, bstring, ustring, phash, pobject, pvarRef> pvar; 
    4761 
    4862// associated enum for checking type 
    4963typedef enum { 
    50         PVAR_NULL,     // p3state 
    51         PVAR_BOOL,     // p3state 
    52         PVAR_LONG,     // long 
    53         PVAR_DOUBLE,   // double 
    54         PVAR_BSTRING,  // bstring 
    55         PVAR_USTRING,  // ustring 
    56         PVAR_HASH,     // rphp::hash 
    57         PVAR_OBJ       // rphp::object 
     64        PVAR_NULL,     // rphp::p3state 
     65        PVAR_BOOL,     // rphp::p3state 
     66        PVAR_INT,      // rphp::pint 
     67        PVAR_FLOAT,    // rphp::pfloat 
     68        PVAR_BSTRING,  // rphp::bstring 
     69        PVAR_USTRING,  // rphp::ustring 
     70        PVAR_HASH,     // rphp::phash 
     71        PVAR_OBJ,      // rphp::pobject 
     72        PVAR_REF           // rphp::pvarRef 
    5873} pvarType; 
    5974 
  • trunk/rphp/runtime/rphp_types.h

    r575 r576  
    3333    } 
    3434 
    35         pvarType operator()(const long &i) const { 
    36         return PVAR_LONG
     35        pvarType operator()(const pint &i) const { 
     36        return PVAR_INT
    3737    } 
    3838 
    39     pvarType operator()(const double &i) const { 
    40         return PVAR_DOUBLE
     39    pvarType operator()(const pfloat &i) const { 
     40        return PVAR_FLOAT
    4141    } 
    4242 
     
    4949    } 
    5050 
    51     pvarType operator()(const php_hash &h) const { 
     51    pvarType operator()(const phash &h) const { 
    5252        return PVAR_HASH; 
    5353    } 
    5454 
    55     pvarType operator()(const php_object &h) const { 
     55    pvarType operator()(const pobject &h) const { 
    5656        return PVAR_OBJ; 
     57    } 
     58 
     59    pvarType operator()(const pvarRef &p) const { 
     60        return PVAR_REF; 
    5761    } 
    5862 
     
    7377        } 
    7478 
    75     void operator()(const long &a) const { 
     79    void operator()(const pint &a) const { 
    7680                // nothing, already numeric 
    7781    } 
    7882 
    79     void operator()(const double &i) const { 
     83    void operator()(const pfloat &i) const { 
    8084                // nothing, already numeric 
    8185    } 
     
    96100    } 
    97101 
    98     void operator()(const php_hash &h) const { 
     102    void operator()(const phash &h) const { 
    99103                var = (long)h.getSize(); 
    100104    } 
    101105 
    102     void operator()(const php_object &h) const { 
     106    void operator()(const pobject &h) const { 
    103107        var = 0l; 
     108    } 
     109 
     110    void operator()(const pvarRef &r) const { 
     111        // unbox 
     112        //boost::apply_visitor(convertToNumber(*r), *r); 
    104113    } 
    105114 
     
    122131} 
    123132 
    124 inline long pvar_getVal_long(const pvar &p) { 
    125         return boost::get<long>(p); 
     133inline long pvar_getVal_int(const pvar &p) { 
     134        return boost::get<pint>(p); 
     135
     136 
     137inline pvarRef pvar_getVal_ref(const pvar &p) { 
     138        return boost::get<pvarRef>(p); 
    126139} 
    127140 
     
    153166        r = pvar_castToNumber(rhs); 
    154167        //std::cout << "pvar_add: r is " << r << std::endl; 
    155         result = pvar_getVal_long(l) + pvar_getVal_long(r); 
     168        result = pvar_getVal_int(l) + pvar_getVal_int(r); 
    156169        //std::cout << "pvar_add: result is " << result << std::endl; 
    157170    } 
  • trunk/rphp/runtime/var-test.cpp

    r572 r576  
    2727    } 
    2828 
    29     int operator()(const long &i) const { 
    30         std::cout << "i see a long" << std::endl; 
     29    int operator()(const rphp::pint &i) const { 
     30        std::cout << "i see a pint" << std::endl; 
    3131        return i; 
    3232    } 
    3333 
    34     int operator()(const double &i) const { 
     34    int operator()(const rphp::pfloat &i) const { 
    3535        std::cout << "i see a float" << std::endl; 
    3636        return 0; 
     
    4747    } 
    4848 
    49     int operator()(const rphp::php_hash &h) const { 
    50         std::cout << "i see a php_hash" << std::endl; 
     49    int operator()(const rphp::phash &h) const { 
     50        std::cout << "i see a phash" << std::endl; 
    5151        return 0; 
    5252    } 
    5353 
    54     int operator()(const rphp::php_object &h) const { 
    55         std::cout << "i see a php_object" << std::endl; 
     54    int operator()(const rphp::pobject &h) const { 
     55        std::cout << "i see a pobject" << std::endl; 
    5656        return 0; 
    5757    } 
    5858 
     59    int operator()(const rphp::pvarRef &h) const { 
     60        std::cout << "i see a php reference" << std::endl; 
     61        return 0; 
     62    } 
    5963}; 
     64 
     65void changeRef(rphp::pvar r) { 
     66 
     67        rphp::pvarRef rval; 
     68        if (rval = rphp::pvar_getVal_ref(r)) { 
     69                *rval = rphp::bstring("changed the ref to a string!"); 
     70        } 
     71        else { 
     72                std::cout << "not a ref" << std::endl; 
     73        } 
     74 
     75} 
    6076 
    6177// driver 
     
    7894 
    7995    // long 
    80     u = 15l
     96    u = rphp::pint(15)
    8197 
    8298    std::cout << u << std::endl; 
     
    84100 
    85101    // float 
    86     u = 2.3123
     102    u = rphp::pfloat(2.3123)
    87103 
    88104    std::cout << u << std::endl; 
     
    106122 
    107123    // php hash 
    108     rphp::php_hash h(5); 
     124    rphp::phash h(5); 
    109125    std::cout << h; 
    110126    u = h; 
     
    121137        std::cout << "found a hash" << std::endl; 
    122138        break; 
    123     case rphp::PVAR_DOUBLE
     139    case rphp::PVAR_FLOAT
    124140        std::cout << "found a float" << std::endl; 
    125141        break; 
     
    141157 
    142158    // try adding a long and a numeric string 
    143     u = 10l; // NOTE: this is a long. int's turn into p3state (bool/null) 
     159    u = rphp::pint(10); // NOTE: this is a long. int's turn into p3state (bool/null) 
    144160    t = std::string("20"); 
    145161    r = pvar_add(u, t); 
     
    148164    std::cout << "t is: " << t << std::endl; 
    149165 
     166    // references 
     167 
     168    // create a new reference. can only be comprise of pvarBase items (i.e., can't be a ref to a ref) 
     169    std::cout << "references----" << std::endl; 
     170    rphp::pvarRef r1(new rphp::pvarBase); 
     171 
     172    // assign a value to the pvar 
     173    *r1 = rphp::pint(5); 
     174    boost::apply_visitor( my_visitor(), *r1 ); 
     175 
     176    // call a function which takes a pvar (not strictly a pvarRef) 
     177    changeRef(r1); 
     178    boost::apply_visitor( my_visitor(), *r1 ); 
     179 
     180    // assign two variables to the same reference 
     181    rphp::pvarRef r2 = r1; 
     182    boost::apply_visitor( my_visitor(), *r1 ); 
     183    boost::apply_visitor( my_visitor(), *r2 ); 
     184 
     185        // change one 
     186    *r2 = rphp::pint(20); 
     187    boost::apply_visitor( my_visitor(), *r1 ); 
     188    boost::apply_visitor( my_visitor(), *r2 ); 
     189 
    150190}