123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- /*
- * Distributed under 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.)
- *
- * See http://www.boost.org/libs/iostreams for documentation.
- *
- * File: boost/iostreams/detail/path.hpp
- * Date: Sat Jun 21 21:24:05 MDT 2008
- * Copyright: 2008 CodeRage, LLC
- * Author: Jonathan Turkanis
- * Contact: turkanis at coderage dot com
- *
- * Defines the class boost::iostreams::detail::path, for storing a
- * a std::string or std::wstring.
- *
- * This class allows interoperability with Boost.Filesystem without
- * creating a dependence on Boost.Filesystem headers or implementation.
- */
- #ifndef BOOST_IOSTREAMS_DETAIL_PATH_HPP_INCLUDED
- #define BOOST_IOSTREAMS_DETAIL_PATH_HPP_INCLUDED
- #include <cstring>
- #include <string>
- #include <boost/iostreams/detail/config/wide_streams.hpp>
- #ifndef BOOST_IOSTREAMS_NO_WIDE_STREAMS
- # include <cwchar>
- #endif
- #include <boost/static_assert.hpp>
- #include <boost/type.hpp>
- #include <boost/type_traits/is_same.hpp>
- namespace boost { namespace iostreams { namespace detail {
- #ifndef BOOST_IOSTREAMS_NO_WIDE_STREAMS //------------------------------------//
- class path {
- template<typename T, typename V>
- struct sfinae
- {
- typedef V type;
- };
- public:
- // Default constructor
- path() : narrow_(), wide_(), is_wide_(false) { }
- // Constructor taking a std::string
- path(const std::string& p) : narrow_(p), wide_(), is_wide_(false) { }
- // Constructor taking a C-style string
- path(const char* p) : narrow_(p), wide_(), is_wide_(false) { }
- // Constructor taking a boost::filesystem2::path or
- // boost::filesystem2::wpath
- template<typename Path>
- explicit path(const Path& p, typename Path::external_string_type* = 0)
- {
- init(p.external_file_string());
- }
- // Constructor taking a boost::filesystem3::path (boost filesystem v3)
- template<typename Path>
- explicit path(const Path& p, typename Path::codecvt_type* = 0)
- {
- init(p.native());
- }
- // Copy constructor
- path(const path& p)
- : narrow_(p.narrow_), wide_(p.wide_), is_wide_(p.is_wide_)
- { }
- // Assignment operator taking another path
- path& operator=(const path& p)
- {
- narrow_ = p.narrow_;
- wide_ = p.wide_;
- is_wide_ = p.is_wide_;
- return *this;
- }
- // Assignment operator taking a std::string
- path& operator=(const std::string& p)
- {
- narrow_ = p;
- wide_.clear();
- is_wide_ = false;
- return *this;
- }
- // Assignment operator taking a C-style string
- path& operator=(const char* p)
- {
- narrow_.assign(p);
- wide_.clear();
- is_wide_ = false;
- return *this;
- }
- #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
- // Assignment operator taking a boost::filesystem2::path or
- // boost::filesystem2::wpath
- // (not on Visual C++ 7.1/8.0, as it seems to have problems with
- // SFINAE functions with the same parameters, doesn't seem
- // worth working around).
- template<typename Path>
- typename sfinae<typename Path::external_string_type, path&>::type
- operator=(const Path& p)
- {
- init(p.external_file_string());
- return *this;
- }
- #endif
- // Assignment operator taking a boost::filesystem3::path
- template<typename Path>
- typename sfinae<typename Path::codecvt_type, path&>::type
- operator=(const Path& p)
- {
- init(p.native());
- return *this;
- }
- bool is_wide() const { return is_wide_; }
- // Returns a representation of the underlying path as a std::string
- // Requires: is_wide() returns false
- const char* c_str() const { return narrow_.c_str(); }
- // Returns a representation of the underlying path as a std::wstring
- // Requires: is_wide() returns true
- const wchar_t* c_wstr() const { return wide_.c_str(); }
- private:
-
- // For wide-character paths, use a boost::filesystem::wpath instead of a
- // std::wstring
- path(const std::wstring&);
- path& operator=(const std::wstring&);
- void init(std::string const& file_path)
- {
- narrow_ = file_path;
- wide_.clear();
- is_wide_ = false;
- }
- void init(std::wstring const& file_path)
- {
- narrow_.clear();
- wide_ = file_path;
- is_wide_ = true;
- }
- std::string narrow_;
- std::wstring wide_;
- bool is_wide_;
- };
- inline bool operator==(const path& lhs, const path& rhs)
- {
- return lhs.is_wide() ?
- rhs.is_wide() && std::wcscmp(lhs.c_wstr(), rhs.c_wstr()) == 0 :
- !rhs.is_wide() && std::strcmp(lhs.c_str(), rhs.c_str()) == 0;
- }
- #else // #ifndef BOOST_IOSTREAMS_NO_WIDE_STREAMS //---------------------------//
- class path {
- public:
- path() { }
- path(const std::string& p) : path_(p) { }
- path(const char* p) : path_(p) { }
- template<typename Path>
- path(const Path& p) : path_(p.external_file_string()) { }
- path(const path& p) : path_(p.path_) { }
- path& operator=(const path& other)
- {
- path_ = other.path_;
- return *this;
- }
- path& operator=(const std::string& p)
- {
- path_ = p;
- return *this;
- }
- path& operator=(const char* p)
- {
- path_ = p;
- return *this;
- }
- template<typename Path>
- path& operator=(const Path& p)
- {
- path_ = p.external_file_string();
- return *this;
- }
- bool is_wide() const { return false; }
- const char* c_str() const { return path_.c_str(); }
- const wchar_t* c_wstr() const { return 0; }
- private:
- std::string path_;
- };
- inline bool operator==(const path& lhs, const path& rhs)
- {
- return std::strcmp(lhs.c_str(), rhs.c_str()) == 0 ;
- }
- #endif // #ifndef BOOST_IOSTREAMS_NO_WIDE_STREAMS //--------------------------//
- } } } // End namespaces detail, iostreams, boost.
- #endif // #ifndef BOOST_IOSTREAMS_DETAIL_PATH_HPP_INCLUDED
|