DGtal 1.4.0
Loading...
Searching...
No Matches
DigitalSetBySTLSet.ih
1/**
2 * This program is free software: you can redistribute it and/or modify
3 * it under the terms of the GNU Lesser General Public License as
4 * published by the Free Software Foundation, either version 3 of the
5 * License, or (at your option) any later version.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 *
15 **/
16
17/**
18 * @file DigitalSetBySTLSet.ih
19 * @author Jacques-Olivier Lachaud (\c jacques-olivier.lachaud@univ-savoie.fr )
20 * Laboratory of Mathematics (CNRS, UMR 5807), University of Savoie, France
21 *
22 * @author Sebastien Fourey (\c Sebastien.Fourey@greyc.ensicaen.fr )
23 * Groupe de Recherche en Informatique, Image, Automatique et
24 * Instrumentation de Caen - GREYC (CNRS, UMR 6072), ENSICAEN, France
25 *
26 * @date 2010/07/01
27 *
28 * Implementation of inline methods defined in DigitalSetBySTLSet.h
29 *
30 * This file is part of the DGtal library.
31 */
32
33
34//////////////////////////////////////////////////////////////////////////////
35#include <cstdlib>
36//////////////////////////////////////////////////////////////////////////////
37
38///////////////////////////////////////////////////////////////////////////////
39// IMPLEMENTATION of inline methods.
40///////////////////////////////////////////////////////////////////////////////
41
42///////////////////////////////////////////////////////////////////////////////
43// ----------------------- Standard services ------------------------------
44
45/**
46 * Destructor.
47 */
48template <typename Domain, typename Compare>
49inline
50DGtal::DigitalSetBySTLSet<Domain, Compare>::~DigitalSetBySTLSet()
51{
52}
53
54/**
55 * Constructor.
56 * Creates the empty set in the domain [d].
57 *
58 * @param d any counted pointer on domain.
59 */
60template <typename Domain, typename Compare>
61inline
62DGtal::DigitalSetBySTLSet<Domain, Compare>::DigitalSetBySTLSet
63( Clone<Domain> d, const Compare & c )
64 : myDomain( d ), mySet( c )
65{
66}
67
68/**
69 * Copy constructor.
70 * @param other the object to clone.
71 */
72template <typename Domain, typename Compare>
73inline
74DGtal::DigitalSetBySTLSet<Domain, Compare>::DigitalSetBySTLSet( const DigitalSetBySTLSet<Domain, Compare> & other )
75 : myDomain( other.myDomain ), mySet( other.mySet )
76{
77}
78
79/**
80 * Assignment.
81 * @param other the object to copy.
82 * @return a reference on 'this'.
83 */
84template <typename Domain, typename Compare>
85inline
86DGtal::DigitalSetBySTLSet<Domain, Compare> &
87DGtal::DigitalSetBySTLSet<Domain, Compare>::operator= ( const DigitalSetBySTLSet<Domain, Compare> & other )
88{
89 ASSERT( ( domain().lowerBound() <= other.domain().lowerBound() )
90 && ( domain().upperBound() >= other.domain().upperBound() )
91 && "This domain should include the domain of the other set in case of assignment." );
92 mySet = other.mySet;
93 return *this;
94}
95
96
97/**
98 * @return the embedding domain.
99 */
100template <typename Domain, typename Compare>
101inline
102const Domain &
103DGtal::DigitalSetBySTLSet<Domain, Compare>::domain() const
104{
105 return *myDomain;
106}
107
108template <typename Domain, typename Compare>
109inline
110DGtal::CowPtr<Domain>
111DGtal::DigitalSetBySTLSet<Domain, Compare>::domainPointer() const
112{
113 return myDomain;
114}
115
116
117
118///////////////////////////////////////////////////////////////////////////////
119// Interface - public :
120
121
122/**
123 * @return the number of elements in the set.
124 */
125template <typename Domain, typename Compare>
126inline
127typename DGtal::DigitalSetBySTLSet<Domain, Compare>::Size
128DGtal::DigitalSetBySTLSet<Domain, Compare>::size() const
129{
130 return (unsigned int)mySet.size();
131}
132
133/**
134 * @return 'true' iff the set is empty (no element).
135 */
136template <typename Domain, typename Compare>
137inline
138bool
139DGtal::DigitalSetBySTLSet<Domain, Compare>::empty() const
140{
141 return mySet.empty();
142}
143
144
145/**
146 * Adds point [p] to this set.
147 *
148 * @param p any digital point.
149 * @pre p should belong to the associated domain.
150 */
151template <typename Domain, typename Compare>
152inline
153void
154DGtal::DigitalSetBySTLSet<Domain, Compare>::insert( const Point & p )
155{
156 // ASSERT( domain().isInside( p ) );
157 mySet.insert( p );
158}
159
160
161/**
162 * Adds the collection of points specified by the two iterators to
163 * this set.
164 *
165 * @param first the start point in the collection of Point.
166 * @param last the last point in the collection of Point.
167 * @pre all points should belong to the associated domain.
168 */
169template <typename Domain, typename Compare>
170template <typename PointInputIterator>
171void
172DGtal::DigitalSetBySTLSet<Domain, Compare>::insert( PointInputIterator first, PointInputIterator last )
173{
174 mySet.insert( first, last );
175}
176
177
178/**
179 * Adds point [p] to this set if the point is not already in the
180 * set.
181 *
182 * @param p any digital point.
183 *
184 * @pre p should belong to the associated domain.
185 * @pre p should not belong to this.
186 */
187template <typename Domain, typename Compare>
188inline
189void
190DGtal::DigitalSetBySTLSet<Domain, Compare>::insertNew( const Point & p )
191{
192 // ASSERT( domain().isInside( p ) );
193 mySet.insert( p );
194}
195
196/**
197 * Adds the collection of points specified by the two iterators to
198 * this set.
199 *
200 * @param first the start point in the collection of Point.
201 * @param last the last point in the collection of Point.
202 *
203 * @pre all points should belong to the associated domain.
204 * @pre each point should not belong to this.
205 */
206template <typename Domain, typename Compare>
207template <typename PointInputIterator>
208inline
209void
210DGtal::DigitalSetBySTLSet<Domain, Compare>::insertNew
211( PointInputIterator first, PointInputIterator last )
212{
213 mySet.insert( first, last );
214}
215
216/**
217 * Removes point [p] from the set.
218 *
219 * @param p the point to remove.
220 * @return the number of removed elements (0 or 1).
221 */
222template <typename Domain, typename Compare>
223typename DGtal::DigitalSetBySTLSet<Domain, Compare>::Size
224DGtal::DigitalSetBySTLSet<Domain, Compare>::erase( const Point & p )
225{
226 return (unsigned int)mySet.erase( p );
227}
228
229/**
230 * Removes the point pointed by [it] from the set.
231 *
232 * @param it an iterator on this set.
233 * Note: generally faster than giving just the point.
234 */
235template <typename Domain, typename Compare>
236inline
237void
238DGtal::DigitalSetBySTLSet<Domain, Compare>::erase( Iterator it )
239{
240 mySet.erase( it );
241}
242
243/**
244 * Clears the set.
245 * @post this set is empty.
246 */
247template <typename Domain, typename Compare>
248inline
249void
250DGtal::DigitalSetBySTLSet<Domain, Compare>::clear()
251{
252 mySet.clear();
253}
254
255/**
256 * @param p any digital point.
257 * @return a const iterator pointing on [p] if found, otherwise end().
258 */
259template <typename Domain, typename Compare>
260inline
261typename DGtal::DigitalSetBySTLSet<Domain, Compare>::ConstIterator
262DGtal::DigitalSetBySTLSet<Domain, Compare>::find( const Point & p ) const
263{
264 return mySet.find( p );
265}
266
267/**
268 * @param p any digital point.
269 * @return an iterator pointing on [p] if found, otherwise end().
270 */
271template <typename Domain, typename Compare>
272inline
273typename DGtal::DigitalSetBySTLSet<Domain, Compare>::Iterator
274DGtal::DigitalSetBySTLSet<Domain, Compare>::find( const Point & p )
275{
276 return mySet.find( p );
277}
278
279/**
280 * @return a const iterator on the first element in this set.
281 */
282template <typename Domain, typename Compare>
283inline
284typename DGtal::DigitalSetBySTLSet<Domain, Compare>::ConstIterator
285DGtal::DigitalSetBySTLSet<Domain, Compare>::begin() const
286{
287 return mySet.begin();
288}
289
290/**
291 * @return a const iterator on the element after the last in this set.
292 */
293template <typename Domain, typename Compare>
294inline
295typename DGtal::DigitalSetBySTLSet<Domain, Compare>::ConstIterator
296DGtal::DigitalSetBySTLSet<Domain, Compare>::end() const
297{
298 return mySet.end();
299}
300
301/**
302 * @return an iterator on the first element in this set.
303 */
304template <typename Domain, typename Compare>
305inline
306typename DGtal::DigitalSetBySTLSet<Domain, Compare>::Iterator
307DGtal::DigitalSetBySTLSet<Domain, Compare>::begin()
308{
309 return mySet.begin();
310}
311
312/**
313 * @return a iterator on the element after the last in this set.
314 */
315template <typename Domain, typename Compare>
316inline
317typename DGtal::DigitalSetBySTLSet<Domain, Compare>::Iterator
318DGtal::DigitalSetBySTLSet<Domain, Compare>::end()
319{
320 return mySet.end();
321}
322
323template <typename Domain, typename Compare>
324inline
325const typename DGtal::DigitalSetBySTLSet<Domain, Compare>::Container &
326DGtal::DigitalSetBySTLSet<Domain, Compare>::container() const
327{
328 return mySet;
329}
330
331template <typename Domain, typename Compare>
332inline
333typename DGtal::DigitalSetBySTLSet<Domain, Compare>::Container &
334DGtal::DigitalSetBySTLSet<Domain, Compare>::container()
335{
336 return mySet;
337}
338
339/**
340 * set union to left.
341 * @param aSet any other set.
342 */
343template <typename Domain, typename Compare>
344inline
345DGtal::DigitalSetBySTLSet<Domain, Compare> &
346DGtal::DigitalSetBySTLSet<Domain, Compare>::operator+=( const DigitalSetBySTLSet<Domain, Compare> & aSet )
347{
348 if ( this != &aSet )
349 {
350 Iterator it_dst = end();
351 for ( ConstIterator it_src = aSet.begin();
352 it_src != aSet.end();
353 ++it_src )
354 {
355 // Use hint it_dst to go faster.
356 it_dst = mySet.insert( it_dst, *it_src );
357 }
358 }
359 return *this;
360}
361
362//-----------------------------------------------------------------------------
363template <typename Domain, typename Compare>
364inline
365bool
366DGtal::DigitalSetBySTLSet<Domain, Compare>
367::operator()( const Point & p ) const
368{
369 return find( p ) != end();
370}
371
372///////////////////////////////////////////////////////////////////////////////
373// ----------------------- Other Set services -----------------------------
374
375
376template <typename Domain, typename Compare>
377template <typename TOutputIterator>
378inline
379void
380DGtal::DigitalSetBySTLSet<Domain, Compare>::computeComplement(TOutputIterator& ito) const
381{
382 typename Domain::ConstIterator itPoint = domain().begin();
383 typename Domain::ConstIterator itEnd = domain().end();
384 while ( itPoint != itEnd ) {
385 if ( find( *itPoint ) == end() ) {
386 *ito++ = *itPoint;
387 }
388 ++itPoint;
389 }
390}
391
392/**
393 * Builds the complement in the domain of the set [other_set] in
394 * this.
395 *
396 * @param other_set defines the set whose complement is assigned to 'this'.
397 */
398template <typename Domain, typename Compare>
399inline
400void
401DGtal::DigitalSetBySTLSet<Domain, Compare>::assignFromComplement
402( const DigitalSetBySTLSet<Domain, Compare> & other_set )
403{
404 clear();
405 typename Domain::ConstIterator itPoint = domain().begin();
406 typename Domain::ConstIterator itEnd = domain().end();
407 while ( itPoint != itEnd ) {
408 if ( other_set.find( *itPoint ) == other_set.end() ) {
409 insert( *itPoint );
410 }
411 ++itPoint;
412 }
413}
414
415/**
416 * Computes the bounding box of this set.
417 *
418 * @param lower the first point of the bounding box (lowest in all
419 * directions).
420 * @param upper the last point of the bounding box (highest in all
421 * directions).
422 */
423template <typename Domain, typename Compare>
424inline
425void
426DGtal::DigitalSetBySTLSet<Domain, Compare>::computeBoundingBox
427( Point & lower, Point & upper ) const
428{
429 lower = domain().upperBound();
430 upper = domain().lowerBound();
431 ConstIterator it = begin();
432 ConstIterator itEnd = end();
433 while ( it != itEnd ) {
434 lower = lower.inf( *it );
435 upper = upper.sup( *it );
436 ++it;
437 }
438}
439
440///////////////////////////////////////////////////////////////////////////////
441// Interface - public :
442
443/**
444 * Writes/Displays the object on an output stream.
445 * @param out the output stream where the object is written.
446 */
447template <typename Domain, typename Compare>
448inline
449void
450DGtal::DigitalSetBySTLSet<Domain, Compare>::selfDisplay ( std::ostream & out ) const
451{
452 out << "[DigitalSetBySTLSet]" << " size=" << size();
453}
454
455/**
456 * Checks the validity/consistency of the object.
457 * @return 'true' if the object is valid, 'false' otherwise.
458 */
459template <typename Domain, typename Compare>
460inline
461bool
462DGtal::DigitalSetBySTLSet<Domain, Compare>::isValid() const
463{
464 return true;
465}
466
467
468// --------------- CDrawableWithBoard2D realization -------------------------
469
470/**
471 * Default drawing style object.
472 * @return the dyn. alloc. default style for this object.
473 */
474
475/**
476 * @return the style name used for drawing this object.
477 */
478template<typename Domain, typename Compare>
479inline
480std::string
481DGtal::DigitalSetBySTLSet<Domain, Compare>::className() const
482{
483 return "DigitalSetBySTLSet";
484}
485
486///////////////////////////////////////////////////////////////////////////////
487// Implementation of inline function //
488
489template <typename Domain, typename Compare>
490inline
491std::ostream &
492DGtal::operator<< ( std::ostream & out, const DGtal::DigitalSetBySTLSet<Domain, Compare> & object )
493{
494 object.selfDisplay( out );
495 return out;
496}
497
498// //
499///////////////////////////////////////////////////////////////////////////////
500
501