106 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| // ----------------------------------------------------------------------------
 | |
| // Copyright (C) 2002-2006 Marcin Kalicinski
 | |
| //
 | |
| // 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)
 | |
| //
 | |
| // For more information, see www.boost.org
 | |
| // ----------------------------------------------------------------------------
 | |
| #ifndef BOOST_PROPERTY_TREE_DETAIL_PTREE_UTILS_HPP_INCLUDED
 | |
| #define BOOST_PROPERTY_TREE_DETAIL_PTREE_UTILS_HPP_INCLUDED
 | |
| 
 | |
| #include <boost/limits.hpp>
 | |
| #include <boost/type_traits/integral_constant.hpp>
 | |
| #include <boost/mpl/has_xxx.hpp>
 | |
| #include <boost/mpl/and.hpp>
 | |
| #include <string>
 | |
| #include <algorithm>
 | |
| #include <locale>
 | |
| 
 | |
| namespace boost { namespace property_tree { namespace detail
 | |
| {
 | |
| 
 | |
|     template<class T>
 | |
|     struct less_nocase
 | |
|     {
 | |
|         typedef typename T::value_type Ch;
 | |
|         std::locale m_locale;
 | |
|         inline bool operator()(Ch c1, Ch c2) const
 | |
|         {
 | |
|             return std::toupper(c1, m_locale) < std::toupper(c2, m_locale);
 | |
|         }
 | |
|         inline bool operator()(const T &t1, const T &t2) const
 | |
|         {
 | |
|             return std::lexicographical_compare(t1.begin(), t1.end(),
 | |
|                                                 t2.begin(), t2.end(), *this);
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     template <typename Ch>
 | |
|     struct is_character : public boost::false_type {};
 | |
|     template <>
 | |
|     struct is_character<char> : public boost::true_type {};
 | |
|     template <>
 | |
|     struct is_character<wchar_t> : public boost::true_type {};
 | |
| 
 | |
| 
 | |
|     BOOST_MPL_HAS_XXX_TRAIT_DEF(internal_type)
 | |
|     BOOST_MPL_HAS_XXX_TRAIT_DEF(external_type)
 | |
|     template <typename T>
 | |
|     struct is_translator : public boost::mpl::and_<
 | |
|         has_internal_type<T>, has_external_type<T> > {};
 | |
| 
 | |
| 
 | |
| 
 | |
|     // Naively convert narrow string to another character type
 | |
|     template<typename Str>
 | |
|     Str widen(const char *text)
 | |
|     {
 | |
|         Str result;
 | |
|         while (*text)
 | |
|         {
 | |
|             result += typename Str::value_type(*text);
 | |
|             ++text;
 | |
|         }
 | |
|         return result;
 | |
|     }
 | |
| 
 | |
|     // Naively convert string to narrow character type
 | |
|     template<typename Str, typename char_type>
 | |
|     Str narrow(const char_type *text)
 | |
|     {
 | |
|         Str result;
 | |
|         while (*text)
 | |
|         {
 | |
|             if (*text < 0 || *text > (std::numeric_limits<char>::max)())
 | |
|                 result += '*';
 | |
|             else
 | |
|                 result += typename Str::value_type(*text);
 | |
|             ++text;
 | |
|         }
 | |
|         return result;
 | |
|     }
 | |
| 
 | |
|     // Remove trailing and leading spaces
 | |
|     template<class Str>
 | |
|     Str trim(const Str &s, const std::locale &loc = std::locale())
 | |
|     {
 | |
|         typename Str::const_iterator first = s.begin();
 | |
|         typename Str::const_iterator end = s.end();
 | |
|         while (first != end && std::isspace(*first, loc))
 | |
|             ++first;
 | |
|         if (first == end)
 | |
|             return Str();
 | |
|         typename Str::const_iterator last = end;
 | |
|         do --last; while (std::isspace(*last, loc));
 | |
|         if (first != s.begin() || last + 1 != end)
 | |
|             return Str(first, last + 1);
 | |
|         else
 | |
|             return s;
 | |
|     }
 | |
| 
 | |
| } } }
 | |
| 
 | |
| #endif
 | 
