| 32 | namespace user { |
| 33 | |
| 34 | mbpath_traits::external_string_type |
| 35 | mbpath_traits::to_external(const mbpath& ph, const internal_string_type& src) |
| 36 | { |
| 37 | std::size_t work_size(cvt->max_length() * (src.size() + 1)); |
| 38 | boost::scoped_array< char > work(new char[work_size]); |
| 39 | std::mbstate_t state; |
| 40 | const internal_string_type::value_type* from_next; |
| 41 | external_string_type::value_type* to_next; |
| 42 | if (cvt->out( |
| 43 | state, src.c_str(), src.c_str() + src.size(), from_next, work.get(), |
| 44 | work.get() + work_size, to_next) != std::codecvt_base::ok) |
| 45 | boost::throw_exception< fs::basic_filesystem_error< mbpath > >( |
| 46 | fs::basic_filesystem_error< mbpath >( |
| 47 | "user::mbpath::to_external conversion error", |
| 48 | ph, boost::system::error_code(EINVAL, boost::system::errno_ecat))); |
| 49 | *to_next = '\0'; |
| 50 | return external_string_type(work.get()); |
| 51 | } |
| 52 | |
| 53 | mbpath_traits::internal_string_type |
| 54 | mbpath_traits::to_internal(const external_string_type& src) |