PCL
SortedArray.h
Go to the documentation of this file.
1 // ____ ______ __
2 // / __ \ / ____// /
3 // / /_/ // / / /
4 // / ____// /___ / /___ PixInsight Class Library
5 // /_/ \____//_____/ PCL 2.8.5
6 // ----------------------------------------------------------------------------
7 // pcl/SortedArray.h - Released 2024-12-28T16:53:48Z
8 // ----------------------------------------------------------------------------
9 // This file is part of the PixInsight Class Library (PCL).
10 // PCL is a multiplatform C++ framework for development of PixInsight modules.
11 //
12 // Copyright (c) 2003-2024 Pleiades Astrophoto S.L. All Rights Reserved.
13 //
14 // Redistribution and use in both source and binary forms, with or without
15 // modification, is permitted provided that the following conditions are met:
16 //
17 // 1. All redistributions of source code must retain the above copyright
18 // notice, this list of conditions and the following disclaimer.
19 //
20 // 2. All redistributions in binary form must reproduce the above copyright
21 // notice, this list of conditions and the following disclaimer in the
22 // documentation and/or other materials provided with the distribution.
23 //
24 // 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names
25 // of their contributors, may be used to endorse or promote products derived
26 // from this software without specific prior written permission. For written
27 // permission, please contact info@pixinsight.com.
28 //
29 // 4. All products derived from this software, in any form whatsoever, must
30 // reproduce the following acknowledgment in the end-user documentation
31 // and/or other materials provided with the product:
32 //
33 // "This product is based on software from the PixInsight project, developed
34 // by Pleiades Astrophoto and its contributors (https://pixinsight.com/)."
35 //
36 // Alternatively, if that is where third-party acknowledgments normally
37 // appear, this acknowledgment must be reproduced in the product itself.
38 //
39 // THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS
40 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
41 // TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS
43 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
44 // EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS
45 // INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE,
46 // DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
47 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
48 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
49 // POSSIBILITY OF SUCH DAMAGE.
50 // ----------------------------------------------------------------------------
51 
52 #ifndef __PCL_SortedArray_h
53 #define __PCL_SortedArray_h
54 
56 
57 #include <pcl/Defs.h>
58 #include <pcl/Diagnostics.h>
59 
60 #include <pcl/Array.h>
61 
62 namespace pcl
63 {
64 
65 // ----------------------------------------------------------------------------
66 
81 template <class T, class A = StandardAllocator>
82 class PCL_CLASS SortedArray : public DirectSortedContainer<T>
83 {
84 public:
85 
89 
93 
97 
101 
105 
109 
113 
117 
121 
125 
126  // -------------------------------------------------------------------------
127 
131  SortedArray() = default;
132 
136  explicit
138  : m_array( n )
139  {
140  }
141 
145  SortedArray( size_type n, const T& v )
146  : m_array( n, v )
147  {
148  }
149 
154  template <class FI>
155  SortedArray( FI i, FI j )
156  : m_array( i, j )
157  {
158  Sort();
159  }
160 
169  template <typename T1>
170  SortedArray( std::initializer_list<T1> l )
171  : SortedArray( l.begin(), l.end() )
172  {
173  }
174 
178  SortedArray( const SortedArray& ) = default;
179 
183  SortedArray( SortedArray&& ) = default;
184 
190  {
191  }
192 
196  bool IsUnique() const
197  {
198  return m_array.IsUnique();
199  }
200 
206  bool IsAliasOf( const SortedArray& x ) const
207  {
208  return m_array.IsAliasOf( x.m_array );
209  }
210 
219  {
220  m_array.EnsureUnique();
221  }
222 
227  size_type Size() const
228  {
229  return m_array.Size();
230  }
231 
236  {
237  return m_array.Length();
238  }
239 
243  {
244  return m_array.Capacity();
245  }
246 
250  {
251  return m_array.Available();
252  }
253 
256  bool IsValid() const
257  {
258  return m_array.IsValid();
259  }
260 
263  bool IsEmpty() const
264  {
265  return m_array.IsEmpty();
266  }
267 
271  {
272  return m_array.LowerBound();
273  }
274 
278  {
279  return m_array.UpperBound();
280  }
281 
284  const allocator& Allocator() const
285  {
286  return m_array.Allocator();
287  }
288 
291  void SetAllocator( const allocator& a )
292  {
293  m_array.SetAllocator( a );
294  }
295 
299  {
300  return m_array.At( i );
301  }
302 
306  {
307  return m_array.At( i );
308  }
309 
313  {
314  return m_array.MutableIterator( i );
315  }
316 
319  const T& operator []( size_type i ) const
320  {
321  return m_array[i];
322  }
323 
326  const T& operator *() const
327  {
328  return *Begin();
329  }
330 
334  {
335  return m_array.ConstBegin();
336  }
337 
341  {
342  return m_array.Begin();
343  }
344 
348  {
349  return m_array.ConstEnd();
350  }
351 
355  {
356  return m_array.End();
357  }
358 
362  {
363  return m_array.ConstReverseBegin();
364  }
365 
369  {
370  return m_array.ReverseBegin();
371  }
372 
376  {
377  return m_array.ConstReverseEnd();
378  }
379 
383  {
384  return m_array.ReverseEnd();
385  }
386 
396  {
397  return m_array.UniquifyIterator( i );
398  }
399 
410  {
411  return m_array.UniquifyIterators( i, j );
412  }
413 
414 #ifndef __PCL_NO_STL_COMPATIBLE_ITERATORS
419  {
420  return Begin();
421  }
422 
427  {
428  return End();
429  }
430 #endif // !__PCL_NO_STL_COMPATIBLE_ITERATORS
431 
438  SortedArray& operator =( const SortedArray& x )
439  {
440  Assign( x );
441  return *this;
442  }
443 
446  void Assign( const SortedArray& x )
447  {
448  m_array.Assign( x.m_array );
449  }
450 
454  SortedArray& operator =( SortedArray&& x )
455  {
456  Transfer( x );
457  return *this;
458  }
459 
463  {
464  m_array.Transfer( x.m_array );
465  }
466 
469  void Transfer( SortedArray&& x )
470  {
471  m_array.Transfer( x.m_array );
472  }
473 
476  SortedArray& operator =( const array_implementation& x )
477  {
478  Assign( x );
479  return *this;
480  }
481 
484  void Assign( const array_implementation& x )
485  {
486  m_array.Assign( x );
487  Sort();
488  }
489 
493  {
494  Transfer( x );
495  return *this;
496  }
497 
501  {
502  m_array.Transfer( x );
503  Sort();
504  }
505 
509  {
510  m_array.Transfer( x );
511  Sort();
512  }
513 
516  void Assign( const T& v, size_type n = 1 )
517  {
518  m_array.Assign( v, n );
519  }
520 
523  template <class FI>
524  void Assign( FI i, FI j )
525  {
526  m_array.Assign( i, j );
527  Sort();
528  }
529 
532  void Import( iterator i, iterator j )
533  {
534  m_array.Import( i, j );
535  Sort();
536  }
537 
541  {
542  return m_array.Release();
543  }
544 
547  void Add( const SortedArray& x )
548  {
549  const_iterator p = x.Begin(), q = x.End();
550  for ( iterator i = m_array.Begin(); i < m_array.End() && p < q; ++i )
551  if ( *p < *i )
552  i = m_array.Insert( i, *p++ );
553  if ( p < q )
554  m_array.Append( p, q );
555  }
556 
559  void Add( const Array<T,A>& x )
560  {
561  Add( x.Begin(), x.End() );
562  }
563 
566  const_iterator Add( const T& v, size_type n = 1 )
567  {
568  return m_array.Insert( pcl::InsertionPoint( m_array.Begin(), m_array.End(), v ), v, n );
569  }
570 
573  template <class FI>
574  void Add( FI i, FI j )
575  {
576  if ( i != j )
577  {
578  m_array.EnsureUnique();
579  for ( iterator l = m_array.Begin(), r = m_array.End(); ; )
580  {
581  FI h = i;
582  iterator m = m_array.Insert( pcl::InsertionPoint( l, r, *i ), *i );
583 
584  if ( ++i == j )
585  break;
586 
587  if ( *i < *h )
588  {
589  l = m_array.Begin();
590  r = m;
591  }
592  else
593  {
594  l = m + 1;
595  r = m_array.End();
596  }
597  }
598  }
599  }
600 
603  void Remove( const_iterator i, size_type n = 1 )
604  {
605  m_array.Remove( const_cast<iterator>( i ), n );
606  }
607 
611  {
612  m_array.Remove( const_cast<iterator>( i ), const_cast<iterator>( j ) );
613  }
614 
624  void RemoveFirst( size_type n = 1 )
625  {
626  m_array.RemoveFirst( n );
627  }
628 
638  void RemoveLast( size_type n = 1 )
639  {
640  m_array.RemoveLast( n );
641  }
642 
654  {
655  m_array.Truncate( const_cast<iterator>( i ) );
656  }
657 
662  void Shrink( size_type n = 1 )
663  {
664  m_array.Shrink( n );
665  }
666 
669  void Remove( const T& v )
670  {
671  const_iterator i = pcl::BinarySearch( Begin(), End(), v );
672  if ( i != End() )
673  Remove( i, pcl::InsertionPoint( i+1, End(), v ) );
674  }
675 
678  void Clear()
679  {
680  m_array.Clear();
681  }
682 
685  void Reserve( size_type n )
686  {
687  m_array.Reserve( n );
688  }
689 
692  void Squeeze()
693  {
694  m_array.Squeeze();
695  }
696 
700  void Fill( const T& v )
701  {
702  m_array.Fill( v );
703  }
704 
707  template <class F>
708  void Apply( F f ) const
709  {
710  pcl::Apply( Begin(), End(), f );
711  }
712 
715  template <class F>
717  {
718  return pcl::FirstThat( Begin(), End(), f );
719  }
720 
723  template <class F>
725  {
726  return pcl::LastThat( Begin(), End(), f );
727  }
728 
731  size_type Count( const T& v ) const
732  {
733  const_iterator i = pcl::BinarySearch( Begin(), End(), v );
734  return (i != End()) ? pcl::InsertionPoint( i+1, End(), v ) - i : 0;
735  }
736 
739  template <class BP>
740  size_type Count( const T& v, BP p ) const
741  {
742  return m_array.Count( v, p );
743  }
744 
747  template <class UP>
748  size_type CountIf( UP p ) const
749  {
750  return m_array.CountIf( p );
751  }
752 
756  {
757  return Begin();
758  }
759 
762  template <class BP>
763  const_iterator MinItem( BP p ) const
764  {
765  return pcl::MinItem( Begin(), End(), p );
766  }
767 
771  {
772  return IsEmpty() ? End() : End()-1;
773  }
774 
777  template <class BP>
778  const_iterator MaxItem( BP p ) const
779  {
780  return pcl::MaxItem( Begin(), End(), p );
781  }
782 
785  const_iterator Search( const T& v ) const
786  {
787  return pcl::BinarySearch( Begin(), End(), v );
788  }
789 
792  template <class BP>
793  const_iterator Search( const T& v, BP p ) const
794  {
795  return m_array.Search( v, p );
796  }
797 
800  const_iterator SearchLast( const T& v ) const
801  {
802  return pcl::BinarySearchLast( Begin(), End(), v );
803  }
804 
807  template <class BP>
808  const_iterator SearchLast( const T& v, BP p ) const
809  {
810  return m_array.SearchLast( v, p );
811  }
812 
815  bool Contains( const T& v ) const
816  {
817  return Search( v ) != End();
818  }
819 
822  template <class BP>
823  bool Contains( const T& v, BP p ) const
824  {
825  return Search( v, p ) != End();
826  }
827 
830  void Sort()
831  {
832  m_array.Sort();
833  }
834 
838  friend void Swap( SortedArray& x1, SortedArray& x2 )
839  {
840  pcl::Swap( x1.m_array, x2.m_array );
841  }
842 
847  friend bool operator ==( const SortedArray& x1, const SortedArray& x2 )
848  {
849  return x1.m_array == x2.m_array;
850  }
851 
856  friend bool operator ==( const SortedArray& x1, const array_implementation& x2 )
857  {
858  return x1.m_array == x2;
859  }
860 
865  friend bool operator ==( const array_implementation& x1, const SortedArray& x2 )
866  {
867  return x1 == x2.m_array;
868  }
869 
875  friend bool operator <( const SortedArray& x1, const SortedArray& x2 )
876  {
877  return x1.m_array < x2.m_array;
878  }
879 
884  friend bool operator <( const SortedArray& x1, const array_implementation& x2 )
885  {
886  return x1.m_array < x2;
887  }
888 
893  friend bool operator <( const array_implementation& x1, const SortedArray& x2 )
894  {
895  return x1 < x2.m_array;
896  }
897 
914  template <class S, typename SP>
915  S& ToSeparated( S& s, SP separator ) const
916  {
917  return m_array.ToSeparated( s, separator );
918  }
919 
942  template <class S, typename SP, class AF>
943  S& ToSeparated( S& s, SP separator, AF append ) const
944  {
945  return m_array.ToSeparated( s, separator, append );
946  }
947 
956  template <class S>
957  S& ToCommaSeparated( S& s ) const
958  {
959  return m_array.ToCommaSeparated( s );
960  }
961 
970  template <class S>
971  S& ToSpaceSeparated( S& s ) const
972  {
973  return m_array.ToSpaceSeparated( s );
974  }
975 
984  template <class S>
985  S& ToTabSeparated( S& s ) const
986  {
987  return m_array.ToTabSeparated( s );
988  }
989 
998  template <class S>
999  S& ToNewLineSeparated( S& s ) const
1000  {
1001  return m_array.ToNewLineSeparated( s );
1002  }
1003 
1012  uint64 Hash64( uint64 seed = 0 ) const
1013  {
1014  return m_array.Hash64( seed );
1015  }
1016 
1025  uint32 Hash32( uint32 seed = 0 ) const
1026  {
1027  return m_array.Hash32( seed );
1028  }
1029 
1034  uint64 Hash( uint64 seed = 0 ) const
1035  {
1036  return Hash64( seed );
1037  }
1038 
1039  // -------------------------------------------------------------------------
1040 
1041 private:
1042 
1043  array_implementation m_array;
1044 };
1045 
1046 // ----------------------------------------------------------------------------
1047 
1056 template <class T, class A, class V> inline
1057 SortedArray<T,A>& operator <<( SortedArray<T,A>& x, const V& v )
1058 {
1059  x.Add( T( v ) );
1060  return x;
1061 }
1062 
1071 template <class T, class A, class V> inline
1072 SortedArray<T,A>& operator <<( SortedArray<T,A>&& x, const V& v )
1073 {
1074  x.Add( T( v ) );
1075  return x;
1076 }
1077 
1083 template <class T, class A> inline
1084 SortedArray<T,A>& operator <<( SortedArray<T,A>& x1, const SortedArray<T,A>& x2 )
1085 {
1086  x1.Add( x2 );
1087  return x1;
1088 }
1089 
1095 template <class T, class A> inline
1096 SortedArray<T,A>& operator <<( SortedArray<T,A>&& x1, const SortedArray<T,A>& x2 )
1097 {
1098  x1.Add( x2 );
1099  return x1;
1100 }
1101 
1107 template <class T, class A> inline
1108 SortedArray<T,A>& operator <<( SortedArray<T,A>& x1, const Array<T,A>& x2 )
1109 {
1110  x1.Add( x2 );
1111  return x1;
1112 }
1113 
1119 template <class T, class A> inline
1120 SortedArray<T,A>& operator <<( SortedArray<T,A>&& x1, const Array<T,A>& x2 )
1121 {
1122  x1.Add( x2 );
1123  return x1;
1124 }
1125 
1126 // ----------------------------------------------------------------------------
1127 
1128 } // pcl
1129 
1130 #endif // __PCL_SortedArray_h
1131 
1132 // ----------------------------------------------------------------------------
1133 // EOF pcl/SortedArray.h - Released 2024-12-28T16:53:48Z
Provides memory allocation for PCL containers.
Definition: Allocator.h:132
Generic dynamic array.
Definition: Array.h:100
iterator Begin()
Definition: Array.h:438
iterator End()
Definition: Array.h:463
A block_allocator
Definition: Array.h:117
T * iterator
Definition: Array.h:125
const T * const_iterator
Definition: Array.h:129
const T const_item_type
Definition: Container.h:89
Root base class of all PCL sorted containers of objects.
Definition: Container.h:118
typename DirectContainer< T >::item_type item_type
Definition: Container.h:124
typename DirectContainer< T >::const_item_type const_item_type
Definition: Container.h:129
Reverse random access iterator.
Definition: Iterator.h:420
Generic dynamic sorted array.
Definition: SortedArray.h:83
void Shrink(size_type n=1)
Definition: SortedArray.h:662
SortedArray(const SortedArray &)=default
SortedArray(size_type n, const T &v)
Definition: SortedArray.h:145
bool IsValid() const
Definition: SortedArray.h:256
size_type Size() const
Definition: SortedArray.h:227
const_reverse_iterator ReverseBegin() const
Definition: SortedArray.h:361
typename array_implementation::block_allocator block_allocator
Definition: SortedArray.h:104
void UniquifyIterator(iterator &i)
Definition: SortedArray.h:395
SortedArray(SortedArray &&)=default
const allocator & Allocator() const
Definition: SortedArray.h:284
const_iterator SearchLast(const T &v, BP p) const
Definition: SortedArray.h:808
bool IsUnique() const
Definition: SortedArray.h:196
bool IsEmpty() const
Definition: SortedArray.h:263
friend void Swap(SortedArray &x1, SortedArray &x2)
Definition: SortedArray.h:838
void Remove(const T &v)
Definition: SortedArray.h:669
iterator MutableEnd()
Definition: SortedArray.h:354
typename array_implementation::allocator allocator
Definition: SortedArray.h:108
const_reverse_iterator ReverseEnd() const
Definition: SortedArray.h:375
bool Contains(const T &v, BP p) const
Definition: SortedArray.h:823
size_type Length() const
Definition: SortedArray.h:235
SortedArray(size_type n)
Definition: SortedArray.h:137
uint32 Hash32(uint32 seed=0) const
Definition: SortedArray.h:1025
void Assign(const SortedArray &x)
Definition: SortedArray.h:446
const_iterator End() const
Definition: SortedArray.h:347
void Transfer(array_implementation &&x)
Definition: SortedArray.h:508
void UniquifyIterators(iterator &i, iterator &j)
Definition: SortedArray.h:409
const_iterator begin() const
Definition: SortedArray.h:418
typename array_implementation::const_iterator const_iterator
Definition: SortedArray.h:116
size_type UpperBound() const
Definition: SortedArray.h:277
const_iterator At(size_type i) const
Definition: SortedArray.h:298
size_type LowerBound() const
Definition: SortedArray.h:270
void Assign(const array_implementation &x)
Definition: SortedArray.h:484
void Transfer(SortedArray &&x)
Definition: SortedArray.h:469
void Add(const SortedArray &x)
Definition: SortedArray.h:547
const_iterator Search(const T &v) const
Definition: SortedArray.h:785
iterator MutableAt(size_type i)
Definition: SortedArray.h:305
void SetAllocator(const allocator &a)
Definition: SortedArray.h:291
void Truncate(const_iterator i)
Definition: SortedArray.h:653
void Fill(const T &v)
Definition: SortedArray.h:700
size_type Available() const
Definition: SortedArray.h:249
typename array_implementation::reverse_iterator reverse_iterator
Definition: SortedArray.h:120
const_iterator MaxItem() const
Definition: SortedArray.h:770
void Apply(F f) const
Definition: SortedArray.h:708
void Remove(const_iterator i, size_type n=1)
Definition: SortedArray.h:603
const_iterator Search(const T &v, BP p) const
Definition: SortedArray.h:793
reverse_iterator MutableReverseBegin()
Definition: SortedArray.h:368
iterator Release()
Definition: SortedArray.h:540
void RemoveFirst(size_type n=1)
Definition: SortedArray.h:624
const_iterator FirstThat(F f) const
Definition: SortedArray.h:716
void Assign(FI i, FI j)
Definition: SortedArray.h:524
SortedArray(FI i, FI j)
Definition: SortedArray.h:155
SortedArray()=default
size_type CountIf(UP p) const
Definition: SortedArray.h:748
typename array_implementation::const_reverse_iterator const_reverse_iterator
Definition: SortedArray.h:124
const_iterator SearchLast(const T &v) const
Definition: SortedArray.h:800
void Assign(const T &v, size_type n=1)
Definition: SortedArray.h:516
bool IsAliasOf(const SortedArray &x) const
Definition: SortedArray.h:206
void Add(const Array< T, A > &x)
Definition: SortedArray.h:559
const_iterator Begin() const
Definition: SortedArray.h:333
void Transfer(SortedArray &x)
Definition: SortedArray.h:462
size_type Count(const T &v) const
Definition: SortedArray.h:731
const_iterator Add(const T &v, size_type n=1)
Definition: SortedArray.h:566
uint64 Hash(uint64 seed=0) const
Definition: SortedArray.h:1034
void Transfer(array_implementation &x)
Definition: SortedArray.h:500
reverse_iterator MutableReverseEnd()
Definition: SortedArray.h:382
void Reserve(size_type n)
Definition: SortedArray.h:685
const_iterator LastThat(F f) const
Definition: SortedArray.h:724
const_iterator end() const
Definition: SortedArray.h:426
uint64 Hash64(uint64 seed=0) const
Definition: SortedArray.h:1012
const_iterator MinItem() const
Definition: SortedArray.h:755
void Import(iterator i, iterator j)
Definition: SortedArray.h:532
const_iterator MaxItem(BP p) const
Definition: SortedArray.h:778
iterator MutableIterator(const_iterator i)
Definition: SortedArray.h:312
typename array_implementation::iterator iterator
Definition: SortedArray.h:112
iterator MutableBegin()
Definition: SortedArray.h:340
bool Contains(const T &v) const
Definition: SortedArray.h:815
void Remove(const_iterator i, const_iterator j)
Definition: SortedArray.h:610
void RemoveLast(size_type n=1)
Definition: SortedArray.h:638
size_type Count(const T &v, BP p) const
Definition: SortedArray.h:740
const_iterator MinItem(BP p) const
Definition: SortedArray.h:763
void Add(FI i, FI j)
Definition: SortedArray.h:574
size_type Capacity() const
Definition: SortedArray.h:242
SortedArray(std::initializer_list< T1 > l)
Definition: SortedArray.h:170
Array< T, A > & operator<<(Array< T, A > &x, const V &v)
Definition: Array.h:2313
bool operator==(const Array< T, A > &x1, const Array< T, A > &x2) noexcept
Definition: Array.h:2285
bool operator<(const Array< T, A > &x1, const Array< T, A > &x2) noexcept
Definition: Array.h:2296
Complex< T1 > operator*(const Complex< T1 > &c1, const Complex< T2 > &c2) noexcept
Definition: Complex.h:562
uint64 Hash64(const void *data, size_type size, uint64 seed=0) noexcept
Definition: Math.h:4830
void Swap(GenericPoint< T > &p1, GenericPoint< T > &p2) noexcept
Definition: Point.h:1459
unsigned long long uint64
Definition: Defs.h:682
unsigned int uint32
Definition: Defs.h:666
FI BinarySearch(FI i, FI j, const T &v) noexcept
Definition: Search.h:170
FI BinarySearchLast(FI i, FI j, const T &v) noexcept
Definition: Search.h:238
FI1 Search(FI1 i1, FI1 j1, FI2 i2, FI2 j2) noexcept
Definition: Search.h:397
FI InsertionPoint(FI i, FI j, const T &v) noexcept
Definition: Search.h:326
size_t size_type
Definition: Defs.h:609
void Sort(BI i, BI j)
Definition: Sort.h:520
BI LastThat(BI i, BI j, UP p) noexcept(noexcept(p))
Definition: Utility.h:350
FI MinItem(FI i, FI j) noexcept
Definition: Utility.h:441
FI MaxItem(FI i, FI j) noexcept
Definition: Utility.h:479
void Apply(FI i, FI j, F f) noexcept(noexcept(f))
Definition: Utility.h:249
FI FirstThat(FI i, FI j, UP p) noexcept(noexcept(p))
Definition: Utility.h:316
PCL root namespace.
Definition: AbstractImage.h:77