Changeset 589
- Timestamp:
- 07/14/08 09:01:38 (4 months ago)
- Files:
-
- trunk/rphp/runtime/rphp_hash.cpp (modified) (2 diffs)
- trunk/rphp/runtime/rphp_hash.h (modified) (4 diffs)
- trunk/rphp/runtime/rphp_pvar.h (modified) (2 diffs)
- trunk/rphp/runtime/test/phashTestCase.cpp (modified) (1 diff)
- trunk/rphp/runtime/test/phashTestCase.h (modified) (2 diffs)
- trunk/rphp/runtime/test/pvarTestCase.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/rphp/runtime/rphp_hash.cpp
r586 r589 19 19 #include "rphp_hash.h" 20 20 21 // hash function for rphp::ustring 22 namespace icu_3_8 { 23 std::size_t hash_value(rphp::ustring const& s) { 24 return static_cast<std::size_t>(s.hashCode()); 25 } 26 } 27 21 28 namespace rphp { 22 29 23 void phash::insert(const bstring &key, pvardata) {30 void phash::insert(const ustring &key, pvar *data) { 24 31 25 hashData ->insert(_dataContainer(key, data));32 hashData.insert(h_container(key, data)); 26 33 27 34 } … … 30 37 31 38 32 std::cout << "array(" << hashData ->size() << ") {" << std::endl;39 std::cout << "array(" << hashData.size() << ") {" << std::endl; 33 40 34 seq_index& ot = get<1>( *hashData);41 seq_index& ot = get<1>(hashData); 35 42 36 43 for (seq_index::iterator it = ot.begin(); it!=ot.end(); it++) { 37 std::cout << " ['" << (*it).key << "'] => " << (*it).data << std::endl;44 std::cout << " ['" << (*it).key << "'] => " << *(*it).data << std::endl; 38 45 } 39 46 trunk/rphp/runtime/rphp_hash.h
r586 r589 26 26 #include <iostream> 27 27 28 #include "cowptr.h"29 28 #include "rphp_pvar.h" 30 29 … … 32 31 using namespace boost::multi_index; 33 32 33 // hash function for rphp::ustring 34 namespace icu_3_8 { 35 std::size_t hash_value(rphp::ustring const& s); 36 } 37 34 38 namespace rphp { 35 39 36 struct _dataContainer { 40 // container we store in our stable hash 41 struct h_container { 37 42 38 pvar data;39 bstring key;43 pvar *data; 44 const ustring key; 40 45 bool isNumKey; 41 46 42 _dataContainer(bstring k, pvard) : data(d), key(k), isNumKey(false) {47 h_container(const ustring k, pvar *d) : data(d), key(k), isNumKey(false) { 43 48 // TODO: set isNumKey based on isNumeric check on key 44 49 // we will need this to emulate their numeric keys … … 49 54 // a boost.multiindex that stores data with two indexes: hashed and sequenced 50 55 typedef multi_index_container< 51 _dataContainer, 56 // the container structure we store for each item in the hash 57 h_container, 58 // index definitions: hash and sequence 52 59 indexed_by< 53 hashed_unique< member< _dataContainer, bstring, &_dataContainer::key> >,60 hashed_unique< member<h_container, const ustring, &h_container::key> >, 54 61 sequenced<> 55 62 > … … 61 68 class phash { 62 69 private: 63 CowPtr< stableHash >hashData;70 stableHash hashData; 64 71 public: 65 72 66 phash() : hashData(new stableHash()) { std::cout << "creating fresh php_hash" << std::endl; }67 /* 73 phash() { std::cout << "creating fresh phash" << std::endl; } 74 68 75 phash(phash const& p) { 69 76 std::cout << "phash copy construct" << std::endl; 70 77 hashData = p.hashData; 71 } 72 */ 73 void insert(const bstring &key, pvardata);78 } 79 80 void insert(const ustring &key, pvar *data); 74 81 75 82 void varDump(); 76 83 77 int getSize() const { return hashData ->size(); }84 int getSize() const { return hashData.size(); } 78 85 79 ~phash() { std::cout << "destorying php_hash" << std::endl; } 86 pvar* operator[] ( const ustring &key ) { 87 stableHash::iterator k = hashData.find(key); 88 if (k == hashData.end()) 89 return NULL; 90 else 91 return (*k).data; 92 } 93 94 95 ~phash() { std::cout << "destroying phash" << std::endl; } 80 96 81 97 }; trunk/rphp/runtime/rphp_pvar.h
r585 r589 59 59 60 60 // base variant that represents a php variable 61 typedef boost::variant< p3state/*int*/, pint/*long*/, pfloat/*double*/, bstring, ustring, boost::recursive_wrapper< phash >/*, pobject*/> pvarBase;61 typedef boost::variant< p3state/*int*/, pint/*long*/, pfloat/*double*/, bstring, ustring, phash/*, pobject*/> pvarBase; 62 62 63 63 // reference to a pvarBase, i.e. a container for pvar variables … … 66 66 67 67 // full pvar definition: a variant that can hold a base type or a reference 68 typedef boost::variant< p3state/*int*/, pint/*long*/, pfloat/*double*/, bstring, ustring, boost::recursive_wrapper< phash >, /*pobject,*/ pvarRef> pvar;68 typedef boost::variant< p3state/*int*/, pint/*long*/, pfloat/*double*/, bstring, ustring, phash, /*pobject,*/ pvarRef> pvar; 69 69 70 70 // associated enum for checking type trunk/rphp/runtime/test/phashTestCase.cpp
r588 r589 11 11 void phashTestCase::basic() 12 12 { 13 /*14 CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, 1.1, 0.05 );15 CPPUNIT_ASSERT( 1 == 0 );16 CPPUNIT_ASSERT( 1 == 1 );17 */18 13 19 rphp::pvar u;14 rphp::pvar* int1 = new rphp::pvar(rphp::pint(971)); 20 15 21 16 // php hash 22 17 rphp::phash h; 23 h.insert("var-test", rphp::pint(971)); 24 rphp::pvar hole = rphp::pfloat(1.234); 25 h.insert("var-test2", hole); 26 std::cout << h; 18 h.insert("var-test", int1); 19 20 //std::cout << *(h["var-test"]) << std::endl; 21 rphp::pvar* int2 = h["var-test"]; 22 23 CPPUNIT_ASSERT( pvar_getVal_int(*int1) == pvar_getVal_int(*int2) ); 24 27 25 h.varDump(); 28 u = h; 29 std::cout << u << std::endl; 30 26 31 27 } 32 28 33 29 /* 34 void phashTestCase:: anotherExample()30 void phashTestCase::setUp() 35 31 { 36 CPPUNIT_ASSERT (1 == 2); 32 33 m_value1 = 2.0; 34 m_value2 = 3.0; 35 37 36 } 38 37 */ 39 void phashTestCase::setUp()40 {41 /*42 m_value1 = 2.0;43 m_value2 = 3.0;44 */45 }46 38 47 /*48 void phashTestCase::testAdd()49 {50 double result = m_value1 + m_value2;51 CPPUNIT_ASSERT( result == 6.0 );52 }53 54 55 void phashTestCase::testEquals()56 {57 long* l1 = new long(12);58 long* l2 = new long(12);59 60 CPPUNIT_ASSERT_EQUAL( 12, 12 );61 CPPUNIT_ASSERT_EQUAL( 12L, 12L );62 CPPUNIT_ASSERT_EQUAL( *l1, *l2 );63 64 delete l1;65 delete l2;66 67 CPPUNIT_ASSERT( 12L == 12L );68 CPPUNIT_ASSERT_EQUAL( 12, 13 );69 CPPUNIT_ASSERT_DOUBLES_EQUAL( 12.0, 11.99, 0.5 );70 }71 */trunk/rphp/runtime/test/phashTestCase.h
r588 r589 14 14 CPPUNIT_TEST_SUITE( phashTestCase ); 15 15 CPPUNIT_TEST( basic ); 16 /*17 CPPUNIT_TEST( anotherExample );18 CPPUNIT_TEST( testAdd );19 CPPUNIT_TEST( testEquals );20 */21 16 CPPUNIT_TEST_SUITE_END(); 22 17 … … 27 22 */ 28 23 24 /* 29 25 public: 30 26 void setUp(); 27 */ 31 28 32 29 protected: 33 30 void basic(); 34 /*35 void anotherExample();36 void testAdd();37 void testEquals();38 */39 31 }; 40 32 trunk/rphp/runtime/test/pvarTestCase.cpp
r588 r589 138 138 139 139 // php hash 140 /* 140 141 rphp::phash h; 141 142 h.insert("var-test", rphp::pint(971)); … … 148 149 149 150 result = boost::apply_visitor( my_visitor(), u ); 150 151 */ 151 152 //// 152 153
