1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
// Copyright (c) 2003-2004 INRIA Sophia-Antipolis (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you may redistribute it under
// the terms of the Q Public License version 1.0.
// See the file LICENSE.QPL distributed with CGAL.
//
// Licensees holding a valid commercial license may use this file in
// accordance with the commercial license agreement provided with the software.
//
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
//
// $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.5-branch/Mesh_2/include/CGAL/Filter_circulator.h $
// $Id: Filter_circulator.h 44130 2008-07-12 21:58:52Z spion $
//
//
// Author(s) : Laurent RINEAU
#ifndef CGAL_FILTRED_CIRCULATOR_H
#define CGAL_FILTRED_CIRCULATOR_H
namespace CGAL {
template <class Circ, class Pred>
class Filter_circulator : public Circ
{
bool is_null;
Pred test;
public:
typedef Filter_circulator<Circ,Pred> Self;
Filter_circulator(const Pred p=Pred()): is_null(true), test(p) {};
Filter_circulator(const Self& c): Circ(c), is_null(c.is_null),
test(c.test) {};
Self& operator=(const Self& c)
{
//this->Circ::operator=(c); // This does not work with bcc
//*this = c; // This does not work with VC++6
static_cast<Circ&>(*this) = static_cast<const Circ&>(c);
is_null=c.is_null;
test=c.test;
return *this;
}
Filter_circulator(const Circ& c, const Pred& p=Pred())
: Circ(c), is_null(false), test(p)
{
if(test(static_cast<Circ&>(*this)))
is_null=false;
else
{
Self end(*this);
do {
this->Circ::operator++();
} while( !test(static_cast<Circ&>(*this)) && (*this)!=end );
if((*this)==end)
is_null=true;
}
};
bool operator==( Nullptr_t ) const {
return is_null;
}
bool operator!=( Nullptr_t ) const {
return !is_null;
}
bool operator==(const Self& c) const
{
return is_null==c.is_null && this->Circ::operator==(c);
}
bool operator!=( const Self& c) const { return !(*this == c); }
Self& operator++() {
CGAL_assertion(!is_null);
do {
this->Circ::operator++();
} while( !test(static_cast<Circ&>(*this)) );
return *this;
}
Self operator++(int) {
Self tmp= *this;
++*this;
return tmp;
}
};
}
#endif
|