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
 |