Ticket #2792: fix.2792.patch

File fix.2792.patch, 3.7 KB (added by andrew.c.morrow@…, 10 years ago)

Use shared_ptr to build tree, rather than by size self reference.

  • string_parse_tree.hpp

    old new  
    1212
    1313#include "boost/lexical_cast.hpp" //error without?
    1414#include "boost/algorithm/string/case_conv.hpp"
     15#include "boost/shared_ptr.hpp"
    1516#include <map>
    1617#include <string>
    1718#include <vector>
     
    8384struct string_parse_tree
    8485{
    8586#if BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x581) )
    86   typedef std::multimap<charT, string_parse_tree< charT> > ptree_coll;
     87  typedef boost::shared_ptr<string_parse_tree< charT> > subtree;
    8788#else
    88   typedef std::multimap<charT, string_parse_tree > ptree_coll;
     89  typedef boost::shared_ptr<string_parse_tree> subtree;
    8990#endif
     91  typedef std::multimap<charT, subtree> ptree_coll;
    9092  typedef typename ptree_coll::value_type value_type;
    9193  typedef typename ptree_coll::iterator iterator;
    9294  typedef typename ptree_coll::const_iterator const_iterator;
     
    126128    while(i < s.size()) {
    127129      if (i==0) {
    128130        if (i == (s.size()-1)) {
    129           ti = m_next_chars.insert(value_type(s[i],
    130                                               string_parse_tree<charT>(value)));
     131          subtree st(new typename subtree::element_type(value));
     132          ti = m_next_chars.insert(value_type(s[i], st));
    131133        }
    132134        else {
    133           ti = m_next_chars.insert(value_type(s[i],
    134                                               string_parse_tree<charT>()));
     135          subtree st(new typename subtree::element_type());
     136          ti = m_next_chars.insert(value_type(s[i], st));
    135137        }
    136138      }
    137139      else {
    138140        if (i == (s.size()-1)) {
    139           ti = ti->second.m_next_chars.insert(value_type(s[i],
    140                                                          string_parse_tree<charT>(value)));
     141          subtree st(new typename subtree::element_type(value));
     142          ti = ti->second->m_next_chars.insert(value_type(s[i], st));
    141143        }
    142144
    143145        else {
    144           ti = ti->second.m_next_chars.insert(value_type(s[i],
    145                                                          string_parse_tree<charT>()));
     146          subtree st(new typename subtree::element_type());
     147          ti = ti->second->m_next_chars.insert(value_type(s[i], st));
    146148        }
    147149
    148150      }
     
    193195        sitr++;
    194196        result.cache += c;
    195197      }
    196       if (litr->second.m_value != -1) { // -1 is default value
     198      if (litr->second->m_value != -1) { // -1 is default value
    197199        if (result.match_depth < level) {
    198           result.current_match = litr->second.m_value;
     200          result.current_match = litr->second->m_value;
    199201          result.match_depth = static_cast<unsigned short>(level);
    200202        }
    201         litr->second.match(sitr, stream_end,
    202                            result, level);
     203        litr->second->match(sitr, stream_end,
     204                            result, level);
    203205        level--;
    204206      }
    205207      else {
    206         litr->second.match(sitr, stream_end,
    207                            result, level);
     208        litr->second->match(sitr, stream_end,
     209                            result, level);
    208210        level--;
    209211      }
    210212
     
    244246    while (itr != end) {
    245247      os << "level:  " << level
    246248         << " node:  " << itr->first
    247          << " value: " << itr->second.m_value
     249         << " value: " << itr->second->m_value
    248250         << std::endl;
    249       itr->second.printme(os, level);
     251      itr->second->printme(os, level);
    250252      itr++;
    251253    }
    252254    level--;
     
    265267    os << "matches for: " << c << std::endl;
    266268    while (litr != uitr) {
    267269      os << " node:  " << litr->first
    268          << " value: " << litr->second.m_value
     270         << " value: " << litr->second->m_value
    269271         << std::endl;
    270272      litr++;
    271273    }