mirror of
https://github.com/boostorg/algorithm.git
synced 2025-07-04 08:16:31 +02:00
implementation changed to use boost::function instead of own
virtualizer [SVN r22658]
This commit is contained in:
@ -10,70 +10,16 @@
|
|||||||
#ifndef BOOST_STRING_FIND_ITERATOR_DETAIL_HPP
|
#ifndef BOOST_STRING_FIND_ITERATOR_DETAIL_HPP
|
||||||
#define BOOST_STRING_FIND_ITERATOR_DETAIL_HPP
|
#define BOOST_STRING_FIND_ITERATOR_DETAIL_HPP
|
||||||
|
|
||||||
|
|
||||||
#include <boost/algorithm/string/config.hpp>
|
#include <boost/algorithm/string/config.hpp>
|
||||||
#include <boost/algorithm/string/iterator_range.hpp>
|
#include <boost/algorithm/string/iterator_range.hpp>
|
||||||
#include <boost/iterator/iterator_facade.hpp>
|
#include <boost/iterator/iterator_facade.hpp>
|
||||||
#include <boost/iterator/iterator_categories.hpp>
|
#include <boost/iterator/iterator_categories.hpp>
|
||||||
|
#include <boost/function.hpp>
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
namespace algorithm {
|
namespace algorithm {
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
// finder virtualizer -----------------------------------------------//
|
|
||||||
|
|
||||||
template<typename IteratorT>
|
|
||||||
struct virtual_finder
|
|
||||||
{
|
|
||||||
// typedefs
|
|
||||||
typedef IteratorT input_iterator_type;
|
|
||||||
typedef iterator_range<IteratorT> match_type;
|
|
||||||
|
|
||||||
// virtual destructor
|
|
||||||
virtual ~virtual_finder() {}
|
|
||||||
|
|
||||||
// clone
|
|
||||||
virtual virtual_finder* clone() const=0;
|
|
||||||
|
|
||||||
// operation
|
|
||||||
virtual match_type do_find(
|
|
||||||
input_iterator_type Begin,
|
|
||||||
input_iterator_type End ) const=0;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename IteratorT, typename FinderT>
|
|
||||||
struct virtual_finder_typed : public virtual_finder<IteratorT>
|
|
||||||
{
|
|
||||||
// typedefs
|
|
||||||
typedef virtual_finder<IteratorT> base_type;
|
|
||||||
typedef BOOST_STRING_TYPENAME
|
|
||||||
base_type::input_iterator_type input_iterator_type;
|
|
||||||
typedef BOOST_STRING_TYPENAME
|
|
||||||
base_type::match_type match_type;
|
|
||||||
|
|
||||||
// constuction
|
|
||||||
virtual_finder_typed( FinderT Finder ) : m_Finder(Finder) {}
|
|
||||||
|
|
||||||
// clone
|
|
||||||
virtual_finder_typed* clone() const
|
|
||||||
{
|
|
||||||
return new virtual_finder_typed(m_Finder);
|
|
||||||
}
|
|
||||||
|
|
||||||
// operation
|
|
||||||
virtual match_type do_find(
|
|
||||||
input_iterator_type Begin,
|
|
||||||
input_iterator_type End ) const
|
|
||||||
{
|
|
||||||
return m_Finder(Begin,End);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Finder
|
|
||||||
FinderT m_Finder;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// find_iterator base -----------------------------------------------//
|
// find_iterator base -----------------------------------------------//
|
||||||
|
|
||||||
// Find iterator base
|
// Find iterator base
|
||||||
@ -84,40 +30,36 @@ namespace boost {
|
|||||||
// typedefs
|
// typedefs
|
||||||
typedef IteratorT input_iterator_type;
|
typedef IteratorT input_iterator_type;
|
||||||
typedef iterator_range<IteratorT> match_type;
|
typedef iterator_range<IteratorT> match_type;
|
||||||
|
typedef function2<
|
||||||
|
match_type,
|
||||||
|
input_iterator_type,
|
||||||
|
input_iterator_type> finder_type;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Protected construction/destruction
|
// Protected construction/destruction
|
||||||
|
|
||||||
// Default constructor
|
// Default constructor
|
||||||
find_iterator_base() : m_pFinder(0) {};
|
find_iterator_base() {};
|
||||||
// Copy construction
|
// Copy construction
|
||||||
find_iterator_base( const find_iterator_base& Other ) :
|
find_iterator_base( const find_iterator_base& Other ) :
|
||||||
m_pFinder(0)
|
m_Finder(Other.m_Finder) {}
|
||||||
{
|
|
||||||
if ( Other.m_pFinder )
|
|
||||||
{
|
|
||||||
m_pFinder=Other.m_pFinder->clone();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Constructor
|
// Constructor
|
||||||
template<typename FinderT>
|
template<typename FinderT>
|
||||||
find_iterator_base( FinderT Finder, int ) :
|
find_iterator_base( FinderT Finder, int ) :
|
||||||
m_pFinder( new virtual_finder_typed<IteratorT,FinderT>(Finder) ) {}
|
m_Finder(Finder) {}
|
||||||
|
|
||||||
// Destructor
|
// Destructor
|
||||||
~find_iterator_base()
|
~find_iterator_base() {}
|
||||||
{
|
|
||||||
if (m_pFinder) delete m_pFinder;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find operation
|
// Find operation
|
||||||
match_type do_find(
|
match_type do_find(
|
||||||
input_iterator_type Begin,
|
input_iterator_type Begin,
|
||||||
input_iterator_type End ) const
|
input_iterator_type End ) const
|
||||||
{
|
{
|
||||||
if (m_pFinder)
|
if (!m_Finder.empty())
|
||||||
{
|
{
|
||||||
return m_pFinder->do_find(Begin,End);
|
return m_Finder(Begin,End);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -128,12 +70,12 @@ namespace boost {
|
|||||||
// Check
|
// Check
|
||||||
bool is_null() const
|
bool is_null() const
|
||||||
{
|
{
|
||||||
return !m_pFinder;
|
return m_Finder.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Finder
|
// Finder
|
||||||
virtual_finder<IteratorT>* m_pFinder;
|
finder_type m_Finder;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
@ -154,7 +154,7 @@ namespace boost {
|
|||||||
/*!
|
/*!
|
||||||
* Construct a find iterator to iterate through the specified collection
|
* Construct a find iterator to iterate through the specified collection
|
||||||
*/
|
*/
|
||||||
template<typename CollectionT, typename FinderT>
|
template<typename CollectionT, typename FinderT>
|
||||||
inline find_iterator<
|
inline find_iterator<
|
||||||
BOOST_STRING_TYPENAME result_iterator_of<CollectionT>::type>
|
BOOST_STRING_TYPENAME result_iterator_of<CollectionT>::type>
|
||||||
make_find_iterator(
|
make_find_iterator(
|
||||||
@ -304,7 +304,7 @@ namespace boost {
|
|||||||
/*!
|
/*!
|
||||||
* Construct a split iterator to iterate through the specified collection
|
* Construct a split iterator to iterate through the specified collection
|
||||||
*/
|
*/
|
||||||
template<typename CollectionT, typename FinderT>
|
template<typename CollectionT, typename FinderT>
|
||||||
inline split_iterator<
|
inline split_iterator<
|
||||||
BOOST_STRING_TYPENAME result_iterator_of<CollectionT>::type>
|
BOOST_STRING_TYPENAME result_iterator_of<CollectionT>::type>
|
||||||
make_split_iterator(
|
make_split_iterator(
|
||||||
|
Reference in New Issue
Block a user