From f738cc36e8f1b8fba6e044f85b82f95a84711ca8 Mon Sep 17 00:00:00 2001 From: eap Date: Thu, 19 Jul 2012 13:14:09 +0000 Subject: [PATCH] 0021459: EDF 1495 SMESH: Manipulation of discrete elements with attributes template, + typename VALUE_FILTER=SMDS::PassAllValueFilter > class SMDS_SetIterator : public SMDS_Iterator --- src/SMDS/SMDS_SetIterator.hxx | 63 ++++++++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 15 deletions(-) diff --git a/src/SMDS/SMDS_SetIterator.hxx b/src/SMDS/SMDS_SetIterator.hxx index cf77424fa..a200bdd9f 100644 --- a/src/SMDS/SMDS_SetIterator.hxx +++ b/src/SMDS/SMDS_SetIterator.hxx @@ -22,7 +22,7 @@ // SMESH SMDS : implementaion of Salome mesh data structure // File : SMDS_SetIterator.hxx -// Created : Mon Feb 27 16:57:43 2006 +// Created : Feb 27 2006 // Author : Edward AGAPOV (eap) // #ifndef SMDS_SetIterator_HeaderFile @@ -30,12 +30,12 @@ #include "SMDS_Iterator.hxx" -/////////////////////////////////////////////////////////////////////////////// -/// Accessors to value pointed by iterator -/////////////////////////////////////////////////////////////////////////////// - namespace SMDS { + /////////////////////////////////////////////////////////////////////////////// + /// Accessors to value pointed by iterator + /////////////////////////////////////////////////////////////////////////////// + template struct SimpleAccessor { static VALUE value(VALUE_SET_ITERATOR it) { return (VALUE) *it; } @@ -50,6 +50,22 @@ namespace SMDS { struct ValueAccessor { static VALUE value(VALUE_SET_ITERATOR it) { return (VALUE) it->second; } }; + + /////////////////////////////////////////////////////////////////////////////// + /// Filters of value pointed by iterator + /////////////////////////////////////////////////////////////////////////////// + + template + struct PassAllValueFilter + { + bool operator()(const VALUE& t ) { return true; } + }; + + template + struct NonNullFilter + { + bool operator()(const VALUE& t ) { return bool( t ); } + }; } /////////////////////////////////////////////////////////////////////////////// @@ -61,26 +77,43 @@ namespace SMDS { template > + typename ACCESOR=SMDS::SimpleAccessor, + typename VALUE_FILTER=SMDS::PassAllValueFilter > class SMDS_SetIterator : public SMDS_Iterator { protected: VALUE_SET_ITERATOR _beg, _end; + VALUE_FILTER _filter; public: SMDS_SetIterator(const VALUE_SET_ITERATOR & begin, - const VALUE_SET_ITERATOR & end) - { init ( begin, end ); } + const VALUE_SET_ITERATOR & end, + const VALUE_FILTER& filter=VALUE_FILTER()) + { init ( begin, end, filter ); } /// Initialization virtual void init(const VALUE_SET_ITERATOR & begin, - const VALUE_SET_ITERATOR & end) - { _beg = begin; _end = end; } - - /// Return true if and only if there are other object in this iterator - virtual bool more() { return _beg != _end; } - + const VALUE_SET_ITERATOR & end, + const VALUE_FILTER& filter=VALUE_FILTER()) + { + _beg = begin; + _end = end; + _filter = filter; + if ( more() && !_filter( ACCESOR::value( _beg ))) + next(); + } + /// Return true iff there are other object in this iterator + virtual bool more() + { + return _beg != _end; + } /// Return the current object and step to the next one - virtual VALUE next() { return ACCESOR::value( _beg++ ); } + virtual VALUE next() + { + VALUE ret = ACCESOR::value( _beg++ ); + while ( more() && !_filter( ACCESOR::value( _beg ))) + ++_beg; + return ret; + } }; ///////////////////////////////////////////////////////////////////////////////