void read_cmdline(int argc, typename Ptree::char_type *argv[], const std::basic_string<typename Ptree::char_type> &metachars, Ptree &pt) { typedef typename Ptree::char_type Ch; typedef std::basic_string<Ch> Str; Ptree local; // For all arguments for (int i = 0; i < argc; ++i) { Str text = detail::trim<Ch>(argv[i]); if (!text.empty()) if (metachars.find(text[0]) != Str::npos) { if (text.size() == 1) { Ptree &child = local.put(text, Str()); Str key; if (child.size() < 10) key.push_back(typename Ptree::char_type('0' + child.size())); child.push_back(std::make_pair(key, Ptree(child.data()))); } else if (text.size() == 2) { Ptree &child = local.put(text.substr(1, 1), Str()); Str key; if (child.size() < 10) key.push_back(typename Ptree::char_type('0' + child.size())); child.push_back(std::make_pair(key, Ptree(child.data()))); } else { Ptree &child = local.put(text.substr(1, 1), detail::trim<Ch>(text.substr(2, Str::npos))); Str key; if (child.size() < 10) key.push_back(typename Ptree::char_type('0' + child.size())); child.push_back(std::make_pair(key, Ptree(child.data()))); } } else { Ptree &child = local.put(Str(), detail::trim<Ch>(text)); Str key; if (child.size() < 10) key.push_back(typename Ptree::char_type('0' + child.size())); child.push_back(std::make_pair(key, Ptree(child.data()))); } } // Swap local and pt pt.swap(local); }
Ptree get_test_ptree() { using namespace boost::property_tree; typedef typename Ptree::key_type::value_type Ch; Ptree pt; pt.put_value(detail::widen<Ch>("data0")); pt.put(detail::widen<Ch>("key1"), detail::widen<Ch>("data1")); pt.put(detail::widen<Ch>("key1.key"), detail::widen<Ch>("data2")); pt.put(detail::widen<Ch>("key2"), detail::widen<Ch>("data3")); pt.put(detail::widen<Ch>("key2.key"), detail::widen<Ch>("data4")); return pt; }