You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
266 lines
9.3 KiB
266 lines
9.3 KiB
// Boost string_algo library collection_traits.hpp header file -------------// |
|
|
|
// Copyright Pavol Droba 2002-2003. Use, modification and |
|
// distribution is subject to 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) |
|
|
|
// (C) Copyright Thorsten Ottosen 2002-2003. Use, modification and |
|
// distribution is subject to 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) |
|
|
|
// (C) Copyright Jeremy Siek 2001. Use, modification and |
|
// distribution is subject to 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) |
|
|
|
// Original idea of container traits was proposed by Jeremy Siek and |
|
// Thorsten Ottosen. This implementation is lightweighted version |
|
// of container_traits adapter for usage with string_algo library |
|
|
|
#ifndef BOOST_RANGE_STRING_COLLECTION_TRAITS_HPP |
|
#define BOOST_RANGE_STRING_COLLECTION_TRAITS_HPP |
|
|
|
#include <boost/algorithm/string/config.hpp> |
|
#include <boost/type_traits/is_array.hpp> |
|
#include <boost/type_traits/is_pointer.hpp> |
|
#include <boost/mpl/eval_if.hpp> |
|
|
|
// Implementation |
|
#include <boost/range/detail/collection_traits_detail.hpp> |
|
|
|
/*! \file |
|
Defines collection_traits class and related free-standing functions. |
|
This facility is used to unify the access to different types of collections. |
|
It allows the algorithms in the library to work with STL collections, c-style |
|
array, null-terminated c-strings (and more) using the same interface. |
|
*/ |
|
|
|
namespace boost { |
|
namespace algorithm { |
|
|
|
// collection_traits template class -----------------------------------------// |
|
|
|
//! collection_traits class |
|
/*! |
|
Collection traits provide uniform access to different types of |
|
collections. This functionality allows to write generic algorithms |
|
which work with several different kinds of collections. |
|
|
|
Currently following collection types are supported: |
|
- containers with STL compatible container interface ( see ContainerConcept ) |
|
( i.e. \c std::vector<>, \c std::list<>, \c std::string<> ... ) |
|
- c-style array |
|
( \c char[10], \c int[15] ... ) |
|
- null-terminated c-strings |
|
( \c char*, \c wchar_T* ) |
|
- std::pair of iterators |
|
( i.e \c std::pair<vector<int>::iterator,vector<int>::iterator> ) |
|
|
|
Collection traits provide an external collection interface operations. |
|
All are accessible using free-standing functions. |
|
|
|
The following operations are supported: |
|
- \c size() |
|
- \c empty() |
|
- \c begin() |
|
- \c end() |
|
|
|
Container traits have somewhat limited functionality on compilers not |
|
supporting partial template specialization and partial template ordering. |
|
*/ |
|
template< typename T > |
|
struct collection_traits |
|
{ |
|
private: |
|
typedef BOOST_STRING_TYPENAME ::boost::mpl::eval_if< |
|
::boost::algorithm::detail::is_pair<T>, |
|
detail::pair_container_traits_selector<T>, |
|
BOOST_STRING_TYPENAME ::boost::mpl::eval_if< |
|
::boost::is_array<T>, |
|
detail::array_container_traits_selector<T>, |
|
BOOST_STRING_TYPENAME ::boost::mpl::eval_if< |
|
::boost::is_pointer<T>, |
|
detail::pointer_container_traits_selector<T>, |
|
detail::default_container_traits_selector<T> |
|
> |
|
> |
|
>::type container_helper_type; |
|
public: |
|
//! Function type |
|
typedef container_helper_type function_type; |
|
//! Value type |
|
typedef BOOST_STRING_TYPENAME |
|
container_helper_type::value_type value_type; |
|
//! Size type |
|
typedef BOOST_STRING_TYPENAME |
|
container_helper_type::size_type size_type; |
|
//! Iterator type |
|
typedef BOOST_STRING_TYPENAME |
|
container_helper_type::iterator iterator; |
|
//! Const iterator type |
|
typedef BOOST_STRING_TYPENAME |
|
container_helper_type::const_iterator const_iterator; |
|
//! Result iterator type ( iterator of const_iterator, depending on the constness of the container ) |
|
typedef BOOST_STRING_TYPENAME |
|
container_helper_type::result_iterator result_iterator; |
|
//! Difference type |
|
typedef BOOST_STRING_TYPENAME |
|
container_helper_type::difference_type difference_type; |
|
|
|
}; // 'collection_traits' |
|
|
|
// collection_traits metafunctions -----------------------------------------// |
|
|
|
//! Container value_type trait |
|
/*! |
|
Extract the type of elements contained in a container |
|
*/ |
|
template< typename C > |
|
struct value_type_of |
|
{ |
|
typedef BOOST_STRING_TYPENAME collection_traits<C>::value_type type; |
|
}; |
|
|
|
//! Container difference trait |
|
/*! |
|
Extract the container's difference type |
|
*/ |
|
template< typename C > |
|
struct difference_type_of |
|
{ |
|
typedef BOOST_STRING_TYPENAME collection_traits<C>::difference_type type; |
|
}; |
|
|
|
//! Container iterator trait |
|
/*! |
|
Extract the container's iterator type |
|
*/ |
|
template< typename C > |
|
struct iterator_of |
|
{ |
|
typedef BOOST_STRING_TYPENAME collection_traits<C>::iterator type; |
|
}; |
|
|
|
//! Container const_iterator trait |
|
/*! |
|
Extract the container's const_iterator type |
|
*/ |
|
template< typename C > |
|
struct const_iterator_of |
|
{ |
|
typedef BOOST_STRING_TYPENAME collection_traits<C>::const_iterator type; |
|
}; |
|
|
|
|
|
//! Container result_iterator |
|
/*! |
|
Extract the container's result_iterator type. This type maps to \c C::iterator |
|
for mutable container and \c C::const_iterator for const containers. |
|
*/ |
|
template< typename C > |
|
struct result_iterator_of |
|
{ |
|
typedef BOOST_STRING_TYPENAME collection_traits<C>::result_iterator type; |
|
}; |
|
|
|
// collection_traits related functions -----------------------------------------// |
|
|
|
//! Free-standing size() function |
|
/*! |
|
Get the size of the container. Uses collection_traits. |
|
*/ |
|
template< typename C > |
|
inline BOOST_STRING_TYPENAME collection_traits<C>::size_type |
|
size( const C& c ) |
|
{ |
|
return collection_traits<C>::function_type::size( c ); |
|
} |
|
|
|
//! Free-standing empty() function |
|
/*! |
|
Check whether the container is empty. Uses container traits. |
|
*/ |
|
template< typename C > |
|
inline bool empty( const C& c ) |
|
{ |
|
return collection_traits<C>::function_type::empty( c ); |
|
} |
|
|
|
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING |
|
|
|
//! Free-standing begin() function |
|
/*! |
|
Get the begin iterator of the container. Uses collection_traits. |
|
*/ |
|
template< typename C > |
|
inline BOOST_STRING_TYPENAME collection_traits<C>::iterator |
|
begin( C& c ) |
|
{ |
|
return collection_traits<C>::function_type::begin( c ); |
|
} |
|
|
|
//! Free-standing begin() function |
|
/*! |
|
\overload |
|
*/ |
|
template< typename C > |
|
inline BOOST_STRING_TYPENAME collection_traits<C>::const_iterator |
|
begin( const C& c ) |
|
{ |
|
return collection_traits<C>::function_type::begin( c ); |
|
} |
|
|
|
//! Free-standing end() function |
|
/*! |
|
Get the begin iterator of the container. Uses collection_traits. |
|
*/ |
|
template< typename C > |
|
inline BOOST_STRING_TYPENAME collection_traits<C>::iterator |
|
end( C& c ) |
|
{ |
|
return collection_traits<C>::function_type::end( c ); |
|
} |
|
|
|
//! Free-standing end() function |
|
/*! |
|
\overload |
|
*/ |
|
template< typename C > |
|
inline BOOST_STRING_TYPENAME collection_traits<C>::const_iterator |
|
end( const C& c ) |
|
{ |
|
return collection_traits<C>::function_type::end( c ); |
|
} |
|
|
|
#else // BOOST_NO_FUNCTION_TEMPLATE_ORDERING |
|
|
|
//! Free-standing begin() function |
|
/*! |
|
\overload |
|
*/ |
|
template< typename C > |
|
inline BOOST_STRING_TYPENAME collection_traits<C>::result_iterator |
|
begin( C& c ) |
|
{ |
|
return collection_traits<C>::function_type::begin( c ); |
|
} |
|
|
|
//! Free-standing end() function |
|
/*! |
|
\overload |
|
*/ |
|
template< typename C > |
|
inline BOOST_STRING_TYPENAME collection_traits<C>::result_iterator |
|
end( C& c ) |
|
{ |
|
return collection_traits<C>::function_type::end( c ); |
|
} |
|
|
|
#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING |
|
|
|
} // namespace algorithm |
|
} // namespace boost |
|
|
|
#endif // BOOST_STRING_COLLECTION_TRAITS_HPP
|
|
|