Tulip  5.2.0
Large graphs analysis and drawing
ConversionIterator.h
1 /*
2  *
3  * This file is part of Tulip (http://tulip.labri.fr)
4  *
5  * Authors: David Auber and the Tulip development Team
6  * from LaBRI, University of Bordeaux
7  *
8  * Tulip is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License
10  * as published by the Free Software Foundation, either version 3
11  * of the License, or (at your option) any later version.
12  *
13  * Tulip is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16  * See the GNU General Public License for more details.
17  *
18  */
19 
20 #ifndef CONVERSIONITERATOR_H
21 #define CONVERSIONITERATOR_H
22 
23 #include <tulip/Iterator.h>
24 #include <tulip/StlIterator.h>
25 #include <tulip/memorypool.h>
26 
27 namespace tlp {
28 /**
29 * @class ConversionIterator
30 * @ingroup Iterators
31 * @brief Iterator that enables to convert an Iterator of type TYPEIN to an Iterator of type TYPEOUT
32 * @param it the iterator that should be converted
33 * @param convFunctor the functor or lamnda function that enables to convert TYPEIN to TYPEOUT
34 *
35 * The functor function shouls have the following form:
36 * @code
37 * class AConversionFunc {
38 * TYPEOUT operator()(TYPEIN a) {
39 * return a converted in TYPEOUT;
40 * }
41 * };
42 * @endcode
43 **/
44 template <typename TYPEIN, typename TYPEOUT, typename ConversionFunc>
45 class ConversionIterator : public Iterator<TYPEOUT> {
46 public:
47  ConversionIterator(Iterator<TYPEIN> *it, ConversionFunc convFunctor)
48  : _it(it), _convFunctor(convFunctor) {}
50  delete _it;
51  }
52  inline bool hasNext() {
53  return _it->hasNext();
54  }
55  inline TYPEOUT next() {
56  return _convFunctor(_it->next());
57  }
58 
59 private:
61  ConversionFunc _convFunctor;
62 };
63 /**
64 * @class MPConversionIterator
65 * @ingroup Iterators
66 * @brief MPConversionIterator implements memory pool for ConversionIterator
67 * @warning never inherit from that class
68 * @see ConversionIterator
69 **/
70 template <typename TIN, typename TOUT, typename ConversionFunc>
71 class MPConversionIterator : public ConversionIterator<TIN, TOUT, ConversionFunc>,
72  public MemoryPool<MPConversionIterator<TIN, TOUT, ConversionFunc>> {
73 public:
74  MPConversionIterator(Iterator<TIN> *it, ConversionFunc convFunctor)
76 };
77 
78 /**
79 * @brief Convenient function for creating a ConversionIterator.
80 * @ingroup Iterators
81 *
82 * @since Tulip 5.2
83 *
84 * Creates a ConversionIterator from another Iterator and a conversion function.
85 * The returned Iterator takes ownership of the one provided as parameter.
86 *
87 * @param it a Tulip Iterator
88 * @param convFunc functor or lambda function converting a value of type TYPEIN to type TYPEOUT
89 *
90 * @return a ConversionIterator
91 *
92 **/
93 template <typename TOUT, typename ConversionFunc, typename TIN>
95  ConversionFunc convFunc) {
96  return new MPConversionIterator<TIN, TOUT, ConversionFunc>(it, convFunc);
97 }
98 
99 /**
100 * @brief Convenient function for creating a ConversionIterator from a STL container.
101 * @ingroup Iterators
102 *
103 * @since Tulip 5.2
104 *
105 * Creates a ConversionIterator from a STL container (std::list, std::vector, std::set, std::map,
106 *...)
107 * and a conversion function.
108 *
109 * @param stlContainer any STL container
110 * @param convFunc functor or lambda function converting a value from the container to type TYPEOUT
111 *
112 * @return a ConversionIterator
113 *
114 **/
115 template <typename TOUT, typename ConversionFunc, typename Container>
116 typename std::enable_if<has_const_iterator<Container>::value,
118  *>::type inline conversionIterator(const Container &stlContainer,
119  ConversionFunc convFunc) {
121  stlIterator(stlContainer), convFunc);
122 }
123 }
124 #endif // CONVERSIONITERATOR_H
Iterator that enables to convert an Iterator of type TYPEIN to an Iterator of type TYPEOUT...
virtual T next()=0
Moves the Iterator on the next element.
Interface for Tulip iterators. Allows basic iteration operations only.
Definition: Graph.h:41
ConversionIterator< TIN, TOUT, ConversionFunc > * conversionIterator(tlp::Iterator< TIN > *it, ConversionFunc convFunc)
Convenient function for creating a ConversionIterator.
bool hasNext()
Tells if the sequence is at its end.
TYPEOUT next()
Moves the Iterator on the next element.
virtual bool hasNext()=0
Tells if the sequence is at its end.
MPConversionIterator implements memory pool for ConversionIterator.
std::enable_if< has_const_iterator< Container >::value, StlIterator< typename Container::value_type, typename Container::const_iterator > * >::type stlIterator(const Container &stlContainer)
Convenient function for creating a StlIterator from a stl container.
Definition: StlIterator.h:95