📄 multi_pass.hpp
字号:
template
<
typename InputT,
typename InputPolicy,
typename OwnershipPolicy,
typename CheckingPolicy,
typename StoragePolicy
>
inline
multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
multi_pass(InputT input)
: OP()
, CHP()
, SP()
, IP(input)
{
}
#if BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
// The standard library shipped with gcc-3.1 has a bug in
// bits/basic_string.tcc. It tries to use iter::iter(0) to
// construct an iterator. Ironically, this happens in sanity
// checking code that isn't required by the standard.
// The workaround is to provide an additional constructor that
// ignores its int argument and behaves like the default constructor.
template
<
typename InputT,
typename InputPolicy,
typename OwnershipPolicy,
typename CheckingPolicy,
typename StoragePolicy
>
inline
multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
multi_pass(int)
: OP()
, CHP()
, SP()
, IP()
{
}
#endif // BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
template
<
typename InputT,
typename InputPolicy,
typename OwnershipPolicy,
typename CheckingPolicy,
typename StoragePolicy
>
inline
multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
~multi_pass()
{
if (OP::release())
{
CHP::destroy();
SP::destroy();
IP::destroy();
}
}
template
<
typename InputT,
typename InputPolicy,
typename OwnershipPolicy,
typename CheckingPolicy,
typename StoragePolicy
>
inline
multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
multi_pass(
multi_pass const& x)
: OP(x)
, CHP(x)
, SP(x)
, IP(x)
{
OP::clone();
}
template
<
typename InputT,
typename InputPolicy,
typename OwnershipPolicy,
typename CheckingPolicy,
typename StoragePolicy
>
inline
multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>&
multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
operator=(
multi_pass const& x)
{
multi_pass temp(x);
temp.swap(*this);
return *this;
}
template
<
typename InputT,
typename InputPolicy,
typename OwnershipPolicy,
typename CheckingPolicy,
typename StoragePolicy
>
inline void
multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
swap(multi_pass& x)
{
OP::swap(x);
CHP::swap(x);
SP::swap(x);
IP::swap(x);
}
template
<
typename InputT,
typename InputPolicy,
typename OwnershipPolicy,
typename CheckingPolicy,
typename StoragePolicy
>
inline
typename multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
reference
multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
operator*() const
{
CHP::check();
return SP::dereference(*this);
}
template
<
typename InputT,
typename InputPolicy,
typename OwnershipPolicy,
typename CheckingPolicy,
typename StoragePolicy
>
inline
typename multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
pointer
multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
operator->() const
{
return &(operator*());
}
template
<
typename InputT,
typename InputPolicy,
typename OwnershipPolicy,
typename CheckingPolicy,
typename StoragePolicy
>
inline
multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>&
multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
operator++()
{
CHP::check();
SP::increment(*this);
return *this;
}
template
<
typename InputT,
typename InputPolicy,
typename OwnershipPolicy,
typename CheckingPolicy,
typename StoragePolicy
>
inline
multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>
multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
operator++(int)
{
multi_pass
<
InputT,
InputPolicy,
OwnershipPolicy,
CheckingPolicy,
StoragePolicy
> tmp(*this);
++*this;
return tmp;
}
template
<
typename InputT,
typename InputPolicy,
typename OwnershipPolicy,
typename CheckingPolicy,
typename StoragePolicy
>
inline void
multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
clear_queue()
{
SP::clear_queue();
CHP::clear_queue();
}
template
<
typename InputT,
typename InputPolicy,
typename OwnershipPolicy,
typename CheckingPolicy,
typename StoragePolicy
>
inline bool
multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
is_eof() const
{
return SP::is_eof(*this);
}
///// Comparisons
template
<
typename InputT,
typename InputPolicy,
typename OwnershipPolicy,
typename CheckingPolicy,
typename StoragePolicy
>
inline bool
multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
operator==(const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
StoragePolicy>& y) const
{
bool is_eof_ = SP::is_eof(*this);
bool y_is_eof_ = SP::is_eof(y);
if (is_eof_ && y_is_eof_)
{
return true; // both are EOF
}
else if (is_eof_ ^ y_is_eof_)
{
return false; // one is EOF, one isn't
}
else if (!IP::same_input(y))
{
return false;
}
else
{
return SP::equal_to(y);
}
}
template
<
typename InputT,
typename InputPolicy,
typename OwnershipPolicy,
typename CheckingPolicy,
typename StoragePolicy
>
inline bool
multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::
operator<(const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
StoragePolicy>& y) const
{
return SP::less_than(y);
}
template
<
typename InputT,
typename InputPolicy,
typename OwnershipPolicy,
typename CheckingPolicy,
typename StoragePolicy
>
inline
bool operator!=(
const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
StoragePolicy>& x,
const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
StoragePolicy>& y)
{
return !(x == y);
}
template
<
typename InputT,
typename InputPolicy,
typename OwnershipPolicy,
typename CheckingPolicy,
typename StoragePolicy
>
inline
bool operator>(
const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
StoragePolicy>& x,
const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
StoragePolicy>& y)
{
return y < x;
}
template
<
typename InputT,
typename InputPolicy,
typename OwnershipPolicy,
typename CheckingPolicy,
typename StoragePolicy
>
inline
bool operator>=(
const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
StoragePolicy>& x,
const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
StoragePolicy>& y)
{
return !(x < y);
}
template
<
typename InputT,
typename InputPolicy,
typename OwnershipPolicy,
typename CheckingPolicy,
typename StoragePolicy
>
inline
bool operator<=(
const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
StoragePolicy>& x,
const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,
StoragePolicy>& y)
{
return !(y < x);
}
///// Generator function
template <typename InputT>
inline multi_pass<InputT>
make_multi_pass(InputT i)
{
return multi_pass<InputT>(i);
}
// this could be a template typedef, since such a thing doesn't
// exist in C++, we'll use inheritance to accomplish the same thing.
template <typename InputT, std::size_t N>
class look_ahead :
public multi_pass<
InputT,
multi_pass_policies::input_iterator,
multi_pass_policies::first_owner,
multi_pass_policies::no_check,
multi_pass_policies::fixed_size_queue<N> >
{
typedef multi_pass<
InputT,
multi_pass_policies::input_iterator,
multi_pass_policies::first_owner,
multi_pass_policies::no_check,
multi_pass_policies::fixed_size_queue<N> > base_t;
public:
look_ahead()
: base_t() {}
explicit look_ahead(InputT x)
: base_t(x) {}
look_ahead(look_ahead const& x)
: base_t(x) {}
#if BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
look_ahead(int) // workaround for a bug in the library
: base_t() {} // shipped with gcc 3.1
#endif // BOOST_WORKAROUND(__GLIBCPP__, == 20020514)
// default generated operators destructor and assignment operator are okay.
};
template
<
typename InputT,
typename InputPolicy,
typename OwnershipPolicy,
typename CheckingPolicy,
typename StoragePolicy
>
void swap(
multi_pass<
InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy
> &x,
multi_pass<
InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy
> &y)
{
x.swap(y);
}
namespace impl {
template <typename T>
inline void mp_swap(T& t1, T& t2)
{
using std::swap;
using boost::spirit::swap;
swap(t1, t2);
}
}
}} // namespace boost::spirit
#endif // BOOST_SPIRIT_ITERATOR_MULTI_PASS_HPP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -