123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964 |
- #ifndef BOOST_FILESYSTEM_PATH_HPP
- #define BOOST_FILESYSTEM_PATH_HPP
- #include <boost/config.hpp>
- # if defined( BOOST_NO_STD_WSTRING )
- # error Configuration not supported: Boost.Filesystem V3 and later requires std::wstring support
- # endif
- #include <boost/filesystem/config.hpp>
- #include <boost/filesystem/path_traits.hpp> // includes <cwchar>
- #include <boost/system/error_code.hpp>
- #include <boost/system/system_error.hpp>
- #include <boost/iterator/iterator_facade.hpp>
- #include <boost/shared_ptr.hpp>
- #include <boost/io/detail/quoted_manip.hpp>
- #include <boost/static_assert.hpp>
- #include <boost/functional/hash_fwd.hpp>
- #include <boost/type_traits/is_integral.hpp>
- #include <string>
- #include <iterator>
- #include <cstring>
- #include <iosfwd>
- #include <stdexcept>
- #include <cassert>
- #include <locale>
- #include <algorithm>
- #include <boost/config/abi_prefix.hpp> // must be the last #include
- namespace boost
- {
- namespace filesystem
- {
-
-
-
-
-
- class BOOST_FILESYSTEM_DECL path
- {
- public:
-
-
- # ifdef BOOST_WINDOWS_API
- typedef wchar_t value_type;
- BOOST_STATIC_CONSTEXPR value_type preferred_separator = L'\\';
- # else
- typedef char value_type;
- BOOST_STATIC_CONSTEXPR value_type preferred_separator = '/';
- # endif
- typedef std::basic_string<value_type> string_type;
- typedef std::codecvt<wchar_t, char,
- std::mbstate_t> codecvt_type;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- path() BOOST_NOEXCEPT {}
- path(const path& p) : m_pathname(p.m_pathname) {}
- template <class Source>
- path(Source const& source,
- typename boost::enable_if<path_traits::is_pathable<
- typename boost::decay<Source>::type> >::type* =0)
- {
- path_traits::dispatch(source, m_pathname);
- }
- path(const value_type* s) : m_pathname(s) {}
- path(value_type* s) : m_pathname(s) {}
- path(const string_type& s) : m_pathname(s) {}
- path(string_type& s) : m_pathname(s) {}
-
-
-
- # if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
- path(path&& p) BOOST_NOEXCEPT { m_pathname = std::move(p.m_pathname); }
- path& operator=(path&& p) BOOST_NOEXCEPT
- { m_pathname = std::move(p.m_pathname); return *this; }
- # endif
- template <class Source>
- path(Source const& source, const codecvt_type& cvt)
- {
- path_traits::dispatch(source, m_pathname, cvt);
- }
- template <class InputIterator>
- path(InputIterator begin, InputIterator end)
- {
- if (begin != end)
- {
-
- std::basic_string<typename std::iterator_traits<InputIterator>::value_type>
- seq(begin, end);
- path_traits::convert(seq.c_str(), seq.c_str()+seq.size(), m_pathname);
- }
- }
- template <class InputIterator>
- path(InputIterator begin, InputIterator end, const codecvt_type& cvt)
- {
- if (begin != end)
- {
-
- std::basic_string<typename std::iterator_traits<InputIterator>::value_type>
- seq(begin, end);
- path_traits::convert(seq.c_str(), seq.c_str()+seq.size(), m_pathname, cvt);
- }
- }
-
- path& operator=(const path& p)
- {
- m_pathname = p.m_pathname;
- return *this;
- }
- template <class Source>
- typename boost::enable_if<path_traits::is_pathable<
- typename boost::decay<Source>::type>, path&>::type
- operator=(Source const& source)
- {
- m_pathname.clear();
- path_traits::dispatch(source, m_pathname);
- return *this;
- }
-
- path& operator=(const value_type* ptr)
- {m_pathname = ptr; return *this;}
- path& operator=(value_type* ptr)
- {m_pathname = ptr; return *this;}
- path& operator=(const string_type& s) {m_pathname = s; return *this;}
- path& operator=(string_type& s) {m_pathname = s; return *this;}
- path& assign(const value_type* ptr, const codecvt_type&)
- {m_pathname = ptr; return *this;}
- template <class Source>
- path& assign(Source const& source, const codecvt_type& cvt)
- {
- m_pathname.clear();
- path_traits::dispatch(source, m_pathname, cvt);
- return *this;
- }
- template <class InputIterator>
- path& assign(InputIterator begin, InputIterator end)
- {
- m_pathname.clear();
- if (begin != end)
- {
- std::basic_string<typename std::iterator_traits<InputIterator>::value_type>
- seq(begin, end);
- path_traits::convert(seq.c_str(), seq.c_str()+seq.size(), m_pathname);
- }
- return *this;
- }
- template <class InputIterator>
- path& assign(InputIterator begin, InputIterator end, const codecvt_type& cvt)
- {
- m_pathname.clear();
- if (begin != end)
- {
- std::basic_string<typename std::iterator_traits<InputIterator>::value_type>
- seq(begin, end);
- path_traits::convert(seq.c_str(), seq.c_str()+seq.size(), m_pathname, cvt);
- }
- return *this;
- }
-
- template <class Source>
- typename boost::enable_if<path_traits::is_pathable<
- typename boost::decay<Source>::type>, path&>::type
- operator+=(Source const& source)
- {
- return concat(source);
- }
-
- path& operator+=(const path& p) { m_pathname += p.m_pathname; return *this; }
- path& operator+=(const value_type* ptr) { m_pathname += ptr; return *this; }
- path& operator+=(value_type* ptr) { m_pathname += ptr; return *this; }
- path& operator+=(const string_type& s) { m_pathname += s; return *this; }
- path& operator+=(string_type& s) { m_pathname += s; return *this; }
- path& operator+=(value_type c) { m_pathname += c; return *this; }
- template <class CharT>
- typename boost::enable_if<is_integral<CharT>, path&>::type
- operator+=(CharT c)
- {
- CharT tmp[2];
- tmp[0] = c;
- tmp[1] = 0;
- return concat(tmp);
- }
- template <class Source>
- path& concat(Source const& source)
- {
- path_traits::dispatch(source, m_pathname);
- return *this;
- }
- template <class Source>
- path& concat(Source const& source, const codecvt_type& cvt)
- {
- path_traits::dispatch(source, m_pathname, cvt);
- return *this;
- }
- template <class InputIterator>
- path& concat(InputIterator begin, InputIterator end)
- {
- if (begin == end)
- return *this;
- std::basic_string<typename std::iterator_traits<InputIterator>::value_type>
- seq(begin, end);
- path_traits::convert(seq.c_str(), seq.c_str()+seq.size(), m_pathname);
- return *this;
- }
- template <class InputIterator>
- path& concat(InputIterator begin, InputIterator end, const codecvt_type& cvt)
- {
- if (begin == end)
- return *this;
- std::basic_string<typename std::iterator_traits<InputIterator>::value_type>
- seq(begin, end);
- path_traits::convert(seq.c_str(), seq.c_str()+seq.size(), m_pathname, cvt);
- return *this;
- }
-
-
-
- path& operator/=(const path& p);
- template <class Source>
- typename boost::enable_if<path_traits::is_pathable<
- typename boost::decay<Source>::type>, path&>::type
- operator/=(Source const& source)
- {
- return append(source);
- }
- path& operator/=(const value_type* ptr);
- path& operator/=(value_type* ptr)
- {
- return this->operator/=(const_cast<const value_type*>(ptr));
- }
- path& operator/=(const string_type& s) { return this->operator/=(path(s)); }
- path& operator/=(string_type& s) { return this->operator/=(path(s)); }
- path& append(const value_type* ptr)
- {
- this->operator/=(ptr);
- return *this;
- }
- path& append(const value_type* ptr, const codecvt_type&)
- {
- this->operator/=(ptr);
- return *this;
- }
- template <class Source>
- path& append(Source const& source);
- template <class Source>
- path& append(Source const& source, const codecvt_type& cvt);
- template <class InputIterator>
- path& append(InputIterator begin, InputIterator end);
- template <class InputIterator>
- path& append(InputIterator begin, InputIterator end, const codecvt_type& cvt);
-
- void clear() BOOST_NOEXCEPT { m_pathname.clear(); }
- path& make_preferred()
- # ifdef BOOST_POSIX_API
- { return *this; }
- # else
- ;
- # endif
- path& remove_filename();
- path& remove_trailing_separator();
- path& replace_extension(const path& new_extension = path());
- void swap(path& rhs) BOOST_NOEXCEPT { m_pathname.swap(rhs.m_pathname); }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- const string_type& native() const BOOST_NOEXCEPT { return m_pathname; }
- const value_type* c_str() const BOOST_NOEXCEPT { return m_pathname.c_str(); }
- string_type::size_type size() const BOOST_NOEXCEPT { return m_pathname.size(); }
- template <class String>
- String string() const;
- template <class String>
- String string(const codecvt_type& cvt) const;
- # ifdef BOOST_WINDOWS_API
- const std::string string() const
- {
- std::string tmp;
- if (!m_pathname.empty())
- path_traits::convert(&*m_pathname.begin(), &*m_pathname.begin()+m_pathname.size(),
- tmp);
- return tmp;
- }
- const std::string string(const codecvt_type& cvt) const
- {
- std::string tmp;
- if (!m_pathname.empty())
- path_traits::convert(&*m_pathname.begin(), &*m_pathname.begin()+m_pathname.size(),
- tmp, cvt);
- return tmp;
- }
-
-
- const std::wstring& wstring() const { return m_pathname; }
- const std::wstring& wstring(const codecvt_type&) const { return m_pathname; }
- # else
-
- const std::string& string() const { return m_pathname; }
- const std::string& string(const codecvt_type&) const { return m_pathname; }
- const std::wstring wstring() const
- {
- std::wstring tmp;
- if (!m_pathname.empty())
- path_traits::convert(&*m_pathname.begin(), &*m_pathname.begin()+m_pathname.size(),
- tmp);
- return tmp;
- }
- const std::wstring wstring(const codecvt_type& cvt) const
- {
- std::wstring tmp;
- if (!m_pathname.empty())
- path_traits::convert(&*m_pathname.begin(), &*m_pathname.begin()+m_pathname.size(),
- tmp, cvt);
- return tmp;
- }
- # endif
-
-
-
-
- path generic() const
- {
- # ifdef BOOST_WINDOWS_API
- path tmp;
- std::replace_copy(m_pathname.begin(), m_pathname.end(),
- std::back_inserter(tmp.m_pathname), L'\\', L'/');
- return tmp;
- # else
- return path(*this);
- # endif
- }
- template <class String>
- String generic_string() const;
- template <class String>
- String generic_string(const codecvt_type& cvt) const;
- # ifdef BOOST_WINDOWS_API
- const std::string generic_string() const;
- const std::string generic_string(const codecvt_type& cvt) const;
- const std::wstring generic_wstring() const;
- const std::wstring generic_wstring(const codecvt_type&) const { return generic_wstring(); };
- # else
-
- const std::string& generic_string() const { return m_pathname; }
- const std::string& generic_string(const codecvt_type&) const { return m_pathname; }
- const std::wstring generic_wstring() const { return wstring(); }
- const std::wstring generic_wstring(const codecvt_type& cvt) const { return wstring(cvt); }
- # endif
-
- int compare(const path& p) const BOOST_NOEXCEPT;
- int compare(const std::string& s) const { return compare(path(s)); }
- int compare(const value_type* s) const { return compare(path(s)); }
-
- path root_path() const;
- path root_name() const;
-
- path root_directory() const;
- path relative_path() const;
- path parent_path() const;
- path filename() const;
- path stem() const;
- path extension() const;
-
- bool empty() const BOOST_NOEXCEPT{ return m_pathname.empty(); }
- bool has_root_path() const { return has_root_directory() || has_root_name(); }
- bool has_root_name() const { return !root_name().empty(); }
- bool has_root_directory() const { return !root_directory().empty(); }
- bool has_relative_path() const { return !relative_path().empty(); }
- bool has_parent_path() const { return !parent_path().empty(); }
- bool has_filename() const { return !m_pathname.empty(); }
- bool has_stem() const { return !stem().empty(); }
- bool has_extension() const { return !extension().empty(); }
- bool is_relative() const { return !is_absolute(); }
- bool is_absolute() const
- {
- # ifdef BOOST_WINDOWS_API
- return has_root_name() && has_root_directory();
- # else
- return has_root_directory();
- # endif
- }
-
- path lexically_normal() const;
- path lexically_relative(const path& base) const;
- path lexically_proximate(const path& base) const
- {
- path tmp(lexically_relative(base));
- return tmp.empty() ? *this : tmp;
- }
-
- class iterator;
- typedef iterator const_iterator;
- class reverse_iterator;
- typedef reverse_iterator const_reverse_iterator;
- iterator begin() const;
- iterator end() const;
- reverse_iterator rbegin() const;
- reverse_iterator rend() const;
-
- static std::locale imbue(const std::locale& loc);
- static const codecvt_type& codecvt();
-
- # if defined(BOOST_FILESYSTEM_DEPRECATED) && defined(BOOST_FILESYSTEM_NO_DEPRECATED)
- # error both BOOST_FILESYSTEM_DEPRECATED and BOOST_FILESYSTEM_NO_DEPRECATED are defined
- # endif
- # if !defined(BOOST_FILESYSTEM_NO_DEPRECATED)
-
- path& normalize() {
- path tmp(lexically_normal());
- m_pathname.swap(tmp.m_pathname);
- return *this;
- }
- path& remove_leaf() { return remove_filename(); }
- path leaf() const { return filename(); }
- path branch_path() const { return parent_path(); }
- bool has_leaf() const { return !m_pathname.empty(); }
- bool has_branch_path() const { return !parent_path().empty(); }
- bool is_complete() const { return is_absolute(); }
- # endif
- # if defined(BOOST_FILESYSTEM_DEPRECATED)
-
-
- const std::string file_string() const { return string(); }
- const std::string directory_string() const { return string(); }
- const std::string native_file_string() const { return string(); }
- const std::string native_directory_string() const { return string(); }
- const string_type external_file_string() const { return native(); }
- const string_type external_directory_string() const { return native(); }
-
-
-
-
-
-
-
-
-
- # endif
- private:
- # if defined(_MSC_VER)
- # pragma warning(push)
- # pragma warning(disable : 4251)
- # endif
- string_type m_pathname;
-
- # if defined(_MSC_VER)
- # pragma warning(pop)
- # endif
- string_type::size_type m_append_separator_if_needed();
-
-
- void m_erase_redundant_separator(string_type::size_type sep_pos);
- string_type::size_type m_parent_path_end() const;
- path& m_normalize();
-
-
- friend class iterator;
- friend bool operator<(const path& lhs, const path& rhs);
-
- static void m_path_iterator_increment(path::iterator & it);
- static void m_path_iterator_decrement(path::iterator & it);
- };
- namespace detail
- {
- BOOST_FILESYSTEM_DECL
- int lex_compare(path::iterator first1, path::iterator last1,
- path::iterator first2, path::iterator last2);
- BOOST_FILESYSTEM_DECL
- const path& dot_path();
- BOOST_FILESYSTEM_DECL
- const path& dot_dot_path();
- }
- # ifndef BOOST_FILESYSTEM_NO_DEPRECATED
- typedef path wpath;
- # endif
-
-
-
-
- class path::iterator
- : public boost::iterator_facade<
- path::iterator,
- path const,
- boost::bidirectional_traversal_tag >
- {
- private:
- friend class boost::iterator_core_access;
- friend class boost::filesystem::path;
- friend class boost::filesystem::path::reverse_iterator;
- friend void m_path_iterator_increment(path::iterator & it);
- friend void m_path_iterator_decrement(path::iterator & it);
- const path& dereference() const { return m_element; }
- bool equal(const iterator & rhs) const
- {
- return m_path_ptr == rhs.m_path_ptr && m_pos == rhs.m_pos;
- }
-
-
- void increment() { m_path_iterator_increment(*this); }
- void decrement() { m_path_iterator_decrement(*this); }
- path m_element;
- const path* m_path_ptr;
- string_type::size_type m_pos;
-
-
-
-
-
- };
-
-
-
-
- class path::reverse_iterator
- : public boost::iterator_facade<
- path::reverse_iterator,
- path const,
- boost::bidirectional_traversal_tag >
- {
- public:
- explicit reverse_iterator(iterator itr) : m_itr(itr)
- {
- if (itr != itr.m_path_ptr->begin())
- m_element = *--itr;
- }
- private:
- friend class boost::iterator_core_access;
- friend class boost::filesystem::path;
- const path& dereference() const { return m_element; }
- bool equal(const reverse_iterator& rhs) const { return m_itr == rhs.m_itr; }
- void increment()
- {
- --m_itr;
- if (m_itr != m_itr.m_path_ptr->begin())
- {
- iterator tmp = m_itr;
- m_element = *--tmp;
- }
- }
- void decrement()
- {
- m_element = *m_itr;
- ++m_itr;
- }
- iterator m_itr;
- path m_element;
- };
- inline path::reverse_iterator path::rbegin() const { return reverse_iterator(end()); }
- inline path::reverse_iterator path::rend() const { return reverse_iterator(begin()); }
-
-
-
-
-
-
-
- inline bool lexicographical_compare(path::iterator first1, path::iterator last1,
- path::iterator first2, path::iterator last2)
- { return detail::lex_compare(first1, last1, first2, last2) < 0; }
-
- inline bool operator==(const path& lhs, const path& rhs) {return lhs.compare(rhs) == 0;}
- inline bool operator==(const path& lhs, const path::string_type& rhs) {return lhs.compare(rhs) == 0;}
- inline bool operator==(const path::string_type& lhs, const path& rhs) {return rhs.compare(lhs) == 0;}
- inline bool operator==(const path& lhs, const path::value_type* rhs) {return lhs.compare(rhs) == 0;}
- inline bool operator==(const path::value_type* lhs, const path& rhs) {return rhs.compare(lhs) == 0;}
-
- inline bool operator!=(const path& lhs, const path& rhs) {return lhs.compare(rhs) != 0;}
- inline bool operator!=(const path& lhs, const path::string_type& rhs) {return lhs.compare(rhs) != 0;}
- inline bool operator!=(const path::string_type& lhs, const path& rhs) {return rhs.compare(lhs) != 0;}
- inline bool operator!=(const path& lhs, const path::value_type* rhs) {return lhs.compare(rhs) != 0;}
- inline bool operator!=(const path::value_type* lhs, const path& rhs) {return rhs.compare(lhs) != 0;}
-
- inline bool operator<(const path& lhs, const path& rhs) {return lhs.compare(rhs) < 0;}
- inline bool operator<=(const path& lhs, const path& rhs) {return !(rhs < lhs);}
- inline bool operator> (const path& lhs, const path& rhs) {return rhs < lhs;}
- inline bool operator>=(const path& lhs, const path& rhs) {return !(lhs < rhs);}
- inline std::size_t hash_value(const path& x)
- {
- # ifdef BOOST_WINDOWS_API
- std::size_t seed = 0;
- for(const path::value_type* it = x.c_str(); *it; ++it)
- hash_combine(seed, *it == '/' ? L'\\' : *it);
- return seed;
- # else
- return hash_range(x.native().begin(), x.native().end());
- # endif
- }
- inline void swap(path& lhs, path& rhs) { lhs.swap(rhs); }
- inline path operator/(const path& lhs, const path& rhs) { return path(lhs) /= rhs; }
-
-
-
- template <class Char, class Traits>
- inline std::basic_ostream<Char, Traits>&
- operator<<(std::basic_ostream<Char, Traits>& os, const path& p)
- {
- return os
- << boost::io::quoted(p.template string<std::basic_string<Char> >(), static_cast<Char>('&'));
- }
-
- template <class Char, class Traits>
- inline std::basic_istream<Char, Traits>&
- operator>>(std::basic_istream<Char, Traits>& is, path& p)
- {
- std::basic_string<Char> str;
- is >> boost::io::quoted(str, static_cast<Char>('&'));
- p = str;
- return is;
- }
-
-
-
-
- BOOST_FILESYSTEM_DECL bool portable_posix_name(const std::string & name);
- BOOST_FILESYSTEM_DECL bool windows_name(const std::string & name);
- BOOST_FILESYSTEM_DECL bool portable_name(const std::string & name);
- BOOST_FILESYSTEM_DECL bool portable_directory_name(const std::string & name);
- BOOST_FILESYSTEM_DECL bool portable_file_name(const std::string & name);
- BOOST_FILESYSTEM_DECL bool native(const std::string & name);
-
- template <class InputIterator>
- path& path::append(InputIterator begin, InputIterator end)
- {
- if (begin == end)
- return *this;
- string_type::size_type sep_pos(m_append_separator_if_needed());
- std::basic_string<typename std::iterator_traits<InputIterator>::value_type>
- seq(begin, end);
- path_traits::convert(seq.c_str(), seq.c_str()+seq.size(), m_pathname);
- if (sep_pos)
- m_erase_redundant_separator(sep_pos);
- return *this;
- }
- template <class InputIterator>
- path& path::append(InputIterator begin, InputIterator end, const codecvt_type& cvt)
- {
- if (begin == end)
- return *this;
- string_type::size_type sep_pos(m_append_separator_if_needed());
- std::basic_string<typename std::iterator_traits<InputIterator>::value_type>
- seq(begin, end);
- path_traits::convert(seq.c_str(), seq.c_str()+seq.size(), m_pathname, cvt);
- if (sep_pos)
- m_erase_redundant_separator(sep_pos);
- return *this;
- }
- template <class Source>
- path& path::append(Source const& source)
- {
- if (path_traits::empty(source))
- return *this;
- string_type::size_type sep_pos(m_append_separator_if_needed());
- path_traits::dispatch(source, m_pathname);
- if (sep_pos)
- m_erase_redundant_separator(sep_pos);
- return *this;
- }
- template <class Source>
- path& path::append(Source const& source, const codecvt_type& cvt)
- {
- if (path_traits::empty(source))
- return *this;
- string_type::size_type sep_pos(m_append_separator_if_needed());
- path_traits::dispatch(source, m_pathname, cvt);
- if (sep_pos)
- m_erase_redundant_separator(sep_pos);
- return *this;
- }
- template <> inline
- std::string path::string<std::string>() const
- { return string(); }
- template <> inline
- std::wstring path::string<std::wstring>() const
- { return wstring(); }
- template <> inline
- std::string path::string<std::string>(const codecvt_type& cvt) const
- { return string(cvt); }
- template <> inline
- std::wstring path::string<std::wstring>(const codecvt_type& cvt) const
- { return wstring(cvt); }
- template <> inline
- std::string path::generic_string<std::string>() const
- { return generic_string(); }
- template <> inline
- std::wstring path::generic_string<std::wstring>() const
- { return generic_wstring(); }
- template <> inline
- std::string path::generic_string<std::string>(const codecvt_type& cvt) const
- { return generic_string(cvt); }
- template <> inline
- std::wstring path::generic_string<std::wstring>(const codecvt_type& cvt) const
- { return generic_wstring(cvt); }
-
-
-
-
- namespace path_traits
- {
- inline
- void convert(const char* from,
- const char* from_end,
- std::wstring & to)
- {
- convert(from, from_end, to, path::codecvt());
- }
- inline
- void convert(const wchar_t* from,
- const wchar_t* from_end,
- std::string & to)
- {
- convert(from, from_end, to, path::codecvt());
- }
- inline
- void convert(const char* from,
- std::wstring & to)
- {
- BOOST_ASSERT(from);
- convert(from, 0, to, path::codecvt());
- }
- inline
- void convert(const wchar_t* from,
- std::string & to)
- {
- BOOST_ASSERT(from);
- convert(from, 0, to, path::codecvt());
- }
- }
- }
- }
- #include <boost/config/abi_suffix.hpp> // pops abi_prefix.hpp pragmas
- #endif
|