mirror of https://github.com/CGAL/cgal
cleanup in CGAL/Iterator_range.h
... and add a default constructor to create an empty range (with singular iterators).
This commit is contained in:
parent
7808c6f93d
commit
9ddc5294fa
|
|
@ -18,56 +18,36 @@
|
|||
|
||||
namespace CGAL {
|
||||
|
||||
/*!
|
||||
\ingroup PkgSTLExtensionRef
|
||||
/// `CGAL::Iterator_range` is a...
|
||||
*/
|
||||
template <typename I>
|
||||
class Iterator_range
|
||||
: public std::pair<I,I>{
|
||||
|
||||
typedef std::pair<I,I> Base;
|
||||
|
||||
public:
|
||||
/*!
|
||||
\ingroup PkgSTLExtensionRef
|
||||
`CGAL::Iterator_range` encapsulates two iterators so they fulfill the `ForwardRange` concept.
|
||||
The class is essentially a clone of <A
|
||||
href="https://www.boost.org/doc/libs/1_55_0/libs/range/doc/html/range/reference/utilities/iterator_range.html">`boost::iterator_range`</A>,
|
||||
and it additionally is derived from `std::pair`, so that one can apply `boost::tie`.
|
||||
*/
|
||||
template <typename I>
|
||||
class Iterator_range : public std::pair<I, I>
|
||||
{
|
||||
typedef std::pair<I, I> Base;
|
||||
|
||||
public:
|
||||
typedef I iterator;
|
||||
typedef I const_iterator;
|
||||
|
||||
Iterator_range() = default;
|
||||
Iterator_range(I b, I e)
|
||||
: Base(b,e)
|
||||
{}
|
||||
: Base(b, e) {}
|
||||
Iterator_range(const std::pair<I, I>& ip)
|
||||
: Base(ip) {}
|
||||
|
||||
|
||||
// Iterator_range(const Iterator_range& ip)
|
||||
// : Base(ip)
|
||||
// {}
|
||||
|
||||
Iterator_range(const std::pair<I,I>& ip)
|
||||
: Base(ip)
|
||||
{}
|
||||
|
||||
I begin() const
|
||||
{
|
||||
return this->first;
|
||||
}
|
||||
|
||||
I end() const
|
||||
{
|
||||
return this->second;
|
||||
}
|
||||
I begin() const { return this->first; }
|
||||
I end() const { return this->second; }
|
||||
|
||||
/// returns `std::distance(begin(), end())`
|
||||
std::size_t
|
||||
size() const
|
||||
{
|
||||
return static_cast<std::size_t>(std::distance(begin(), end()));
|
||||
}
|
||||
std::size_t size() const { return static_cast<std::size_t>(std::distance(begin(), end())); }
|
||||
|
||||
/// returns `std::distance(begin(), end())==0`
|
||||
bool empty() const
|
||||
{
|
||||
return begin()==end();
|
||||
}
|
||||
bool empty() const { return begin() == end(); }
|
||||
|
||||
operator std::tuple<I&, I&>()
|
||||
{
|
||||
|
|
@ -87,37 +67,25 @@ namespace CGAL {
|
|||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
Iterator_range<T>
|
||||
make_range(const T& b, const T&e)
|
||||
{
|
||||
template <typename T>
|
||||
Iterator_range<T>
|
||||
make_range(const T& b, const T&e)
|
||||
{
|
||||
return Iterator_range<T>(b,e);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
Iterator_range<T>
|
||||
make_range(const std::pair<T,T>& p)
|
||||
{
|
||||
template <typename T>
|
||||
Iterator_range<T>
|
||||
make_range(const std::pair<T,T>& p)
|
||||
{
|
||||
return Iterator_range<T>(p.first,p.second);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // namespace CGAL
|
||||
|
||||
// At global scope...
|
||||
|
||||
namespace boost::foreach {
|
||||
template<typename T>
|
||||
inline boost::mpl::true_ *
|
||||
boost_foreach_is_lightweight_proxy( CGAL::Iterator_range<T> *&, boost::foreach::tag )
|
||||
{
|
||||
return 0;
|
||||
struct is_lightweight_proxy<CGAL::Iterator_range<T>> : boost::mpl::true_ {};
|
||||
}
|
||||
namespace boost { namespace foreach
|
||||
{
|
||||
template<typename T>
|
||||
struct is_lightweight_proxy< CGAL::Iterator_range<T> >
|
||||
: mpl::true_
|
||||
{
|
||||
};
|
||||
}}
|
||||
#endif // CGAL_ITERATOR_RANGE_H
|
||||
|
|
|
|||
Loading…
Reference in New Issue