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
							 |