--- ./boost/src/svn/boost/date_time/string_parse_tree.hpp 2012-07-13 19:35:35.000000000 -0400 +++ ./string_parse_tree_fix/string_parse_tree.hpp 2012-07-13 20:00:33.000000000 -0400 @@ -12,6 +12,7 @@ #include "boost/lexical_cast.hpp" //error without? #include "boost/algorithm/string/case_conv.hpp" +#include "boost/shared_ptr.hpp" #include #include #include @@ -83,10 +84,11 @@ struct string_parse_tree { #if BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x581) ) - typedef std::multimap > ptree_coll; + typedef boost::shared_ptr > subtree; #else - typedef std::multimap ptree_coll; + typedef boost::shared_ptr subtree; #endif + typedef std::multimap ptree_coll; typedef typename ptree_coll::value_type value_type; typedef typename ptree_coll::iterator iterator; typedef typename ptree_coll::const_iterator const_iterator; @@ -126,23 +128,23 @@ while(i < s.size()) { if (i==0) { if (i == (s.size()-1)) { - ti = m_next_chars.insert(value_type(s[i], - string_parse_tree(value))); + subtree st(new typename subtree::element_type(value)); + ti = m_next_chars.insert(value_type(s[i], st)); } else { - ti = m_next_chars.insert(value_type(s[i], - string_parse_tree())); + subtree st(new typename subtree::element_type()); + ti = m_next_chars.insert(value_type(s[i], st)); } } else { if (i == (s.size()-1)) { - ti = ti->second.m_next_chars.insert(value_type(s[i], - string_parse_tree(value))); + subtree st(new typename subtree::element_type(value)); + ti = ti->second->m_next_chars.insert(value_type(s[i], st)); } else { - ti = ti->second.m_next_chars.insert(value_type(s[i], - string_parse_tree())); + subtree st(new typename subtree::element_type()); + ti = ti->second->m_next_chars.insert(value_type(s[i], st)); } } @@ -193,18 +195,18 @@ sitr++; result.cache += c; } - if (litr->second.m_value != -1) { // -1 is default value + if (litr->second->m_value != -1) { // -1 is default value if (result.match_depth < level) { - result.current_match = litr->second.m_value; + result.current_match = litr->second->m_value; result.match_depth = static_cast(level); } - litr->second.match(sitr, stream_end, - result, level); + litr->second->match(sitr, stream_end, + result, level); level--; } else { - litr->second.match(sitr, stream_end, - result, level); + litr->second->match(sitr, stream_end, + result, level); level--; } @@ -244,9 +246,9 @@ while (itr != end) { os << "level: " << level << " node: " << itr->first - << " value: " << itr->second.m_value + << " value: " << itr->second->m_value << std::endl; - itr->second.printme(os, level); + itr->second->printme(os, level); itr++; } level--; @@ -265,7 +267,7 @@ os << "matches for: " << c << std::endl; while (litr != uitr) { os << " node: " << litr->first - << " value: " << litr->second.m_value + << " value: " << litr->second->m_value << std::endl; litr++; }