//  Boost.Filesystem mbpath.hpp  ---------------------------------------------//

//  Copyright Beman Dawes 2005

//  Use, modification, and distribution is subject to the Boost Software
//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
//  http://www.boost.org/LICENSE_1_0.txt)

//  Encodes wide character paths as MBCS
//  See http://../doc/path.htm#mbpath for more information

#include <boost/filesystem/path.hpp>
#include <cwchar>     // for std::mbstate_t
#include <string>
#include <locale>

namespace user
{
  struct mbpath_traits;
  
  typedef boost::filesystem::basic_path<std::wstring, mbpath_traits> mbpath;

  struct mbpath_traits
  {
    typedef std::wstring internal_string_type;
    typedef std::string external_string_type;

    static external_string_type to_external( const mbpath & ph,
      const internal_string_type & src );

    static internal_string_type to_internal( const external_string_type & src );

    static void imbue( const std::locale & loc );
  };
} // namespace user

namespace boost
{
  namespace filesystem2
  {
    template<> struct is_basic_path<user::mbpath>
      { static const bool value = true; };
  }
}
