Boost logo

Boost :

Subject: [boost] [property_tree] handling of filesystem::path
From: Johan Råde (rade_at_[hidden])
Date: 2010-06-13 02:47:26

property_tree::ptree does not handle filesystem::path
values correctly if the path contains spaces.

Here is a proposed fix and a test.
The test succeeds, but if you comment out the patch, then the test fails.


#include <boost/property_tree/ptree.hpp>

// patch that fixes the problem

namespace boost { namespace filesystem {
     template<class String, class PathTraits> class basic_path;

namespace boost { namespace property_tree {

     template<typename String, typename PathTraits> struct path_translator
         typedef boost::filesystem::basic_path<String, PathTraits> Path;

         typedef String internal_type;
         typedef Path external_type;

         boost::optional<Path> get_value(const String& s) { return Path(s); }
         boost::optional<String> put_value(const Path &p) { return p.string(); }

     template <typename Char, typename StringTraits, typename Alloc, typename PathTraits>
     struct translator_between<
         std::basic_string<Char, StringTraits, Alloc>,
         boost::filesystem::basic_path<std::basic_string<Char, StringTraits, Alloc>, PathTraits>
         typedef std::basic_string<Char, StringTraits, Alloc> String;
         typedef path_translator<String, PathTraits> type;

// a simple test

#include <boost/filesystem/path.hpp>
#include <boost/optional.hpp>

using boost::filesystem::path;
using boost::optional;
using boost::property_tree::ptree;

int main()
     path p1("a b");
     ptree t;
     optional<path> p2 = t.get_value_optional<path>();
     assert(p1 == *p2);

Boost list run by bdawes at, gregod at, cpdaniel at, john at