1 // 2 // Copyright 2007-2008 Andreas Pokorny, Christian Henning 3 // 4 // Distributed under the Boost Software License, Version 1.0 5 // See accompanying file LICENSE_1_0.txt or copy at 6 // http://www.boost.org/LICENSE_1_0.txt 7 // 8 #ifndef BOOST_GIL_IO_PATH_SPEC_HPP 9 #define BOOST_GIL_IO_PATH_SPEC_HPP 10 11 #ifdef BOOST_GIL_IO_ADD_FS_PATH_SUPPORT 12 // Disable warning: conversion to 'std::atomic<int>::__integral_type {aka int}' from 'long int' may alter its value 13 #if defined(BOOST_CLANG) 14 #pragma clang diagnostic push 15 #pragma clang diagnostic ignored "-Wshorten-64-to-32" 16 #endif 17 18 #if defined(BOOST_GCC) && (BOOST_GCC >= 40900) 19 #pragma GCC diagnostic push 20 #pragma GCC diagnostic ignored "-Wconversion" 21 #endif 22 23 #define BOOST_FILESYSTEM_VERSION 3 24 #include <boost/filesystem/path.hpp> 25 26 #if defined(BOOST_CLANG) 27 #pragma clang diagnostic pop 28 #endif 29 30 #if defined(BOOST_GCC) && (BOOST_GCC >= 40900) 31 #pragma GCC diagnostic pop 32 #endif 33 #endif // BOOST_GIL_IO_ADD_FS_PATH_SUPPORT 34 35 #include <cstdlib> 36 #include <string> 37 #include <type_traits> 38 39 namespace boost { namespace gil { namespace detail { 40 41 template<typename P> struct is_supported_path_spec : std::false_type {}; 42 template<> struct is_supported_path_spec< std::string > : std::true_type {}; 43 template<> struct is_supported_path_spec< const std::string > : std::true_type {}; 44 template<> struct is_supported_path_spec< std::wstring > : std::true_type {}; 45 template<> struct is_supported_path_spec< const std::wstring > : std::true_type {}; 46 template<> struct is_supported_path_spec< const char* > : std::true_type {}; 47 template<> struct is_supported_path_spec< char* > : std::true_type {}; 48 template<> struct is_supported_path_spec< const wchar_t* > : std::true_type {}; 49 template<> struct is_supported_path_spec< wchar_t* > : std::true_type {}; 50 51 template<int i> struct is_supported_path_spec<const char [i]> : std::true_type {}; 52 template<int i> struct is_supported_path_spec<char [i]> : std::true_type {}; 53 template<int i> struct is_supported_path_spec<const wchar_t [i]> : std::true_type {}; 54 template<int i> struct is_supported_path_spec<wchar_t [i]> : std::true_type {}; 55 56 #ifdef BOOST_GIL_IO_ADD_FS_PATH_SUPPORT 57 template<> struct is_supported_path_spec< filesystem::path > : std::true_type {}; 58 template<> struct is_supported_path_spec< const filesystem::path > : std::true_type {}; 59 #endif // BOOST_GIL_IO_ADD_FS_PATH_SUPPORT 60 61 62 /// 63 /// convert_to_string 64 /// 65 convert_to_string(std::string const & obj)66inline std::string convert_to_string( std::string const& obj) 67 { 68 return obj; 69 } 70 convert_to_string(std::wstring const & s)71inline std::string convert_to_string( std::wstring const& s ) 72 { 73 std::size_t len = wcslen( s.c_str() ); 74 char* c = reinterpret_cast<char*>( alloca( len )); 75 wcstombs( c, s.c_str(), len ); 76 77 return std::string( c, c + len ); 78 } 79 convert_to_string(const char * str)80inline std::string convert_to_string( const char* str ) 81 { 82 return std::string( str ); 83 } 84 convert_to_string(char * str)85inline std::string convert_to_string( char* str ) 86 { 87 return std::string( str ); 88 } 89 90 #ifdef BOOST_GIL_IO_ADD_FS_PATH_SUPPORT convert_to_string(const filesystem::path & path)91inline std::string convert_to_string( const filesystem::path& path ) 92 { 93 return convert_to_string( path.string() ); 94 } 95 #endif // BOOST_GIL_IO_ADD_FS_PATH_SUPPORT 96 97 /// 98 /// convert_to_native_string 99 /// 100 convert_to_native_string(char * str)101inline const char* convert_to_native_string( char* str ) 102 { 103 return str; 104 } 105 convert_to_native_string(const char * str)106inline const char* convert_to_native_string( const char* str ) 107 { 108 return str; 109 } 110 convert_to_native_string(const std::string & str)111inline const char* convert_to_native_string( const std::string& str ) 112 { 113 return str.c_str(); 114 } 115 convert_to_native_string(const wchar_t * str)116inline const char* convert_to_native_string( const wchar_t* str ) 117 { 118 std::size_t len = wcslen( str ) + 1; 119 char* c = new char[len]; 120 wcstombs( c, str, len ); 121 122 return c; 123 } 124 convert_to_native_string(const std::wstring & str)125inline const char* convert_to_native_string( const std::wstring& str ) 126 { 127 std::size_t len = wcslen( str.c_str() ) + 1; 128 char* c = new char[len]; 129 wcstombs( c, str.c_str(), len ); 130 131 return c; 132 } 133 134 } // namespace detail 135 } // namespace gil 136 } // namespace boost 137 138 #endif 139