PCL
ReferenceSortedArray.h
Go to the documentation of this file.
1 // ____ ______ __
2 // / __ \ / ____// /
3 // / /_/ // / / /
4 // / ____// /___ / /___ PixInsight Class Library
5 // /_/ \____//_____/ PCL 2.9.3
6 // ----------------------------------------------------------------------------
7 // pcl/ReferenceSortedArray.h - Released 2025-02-21T12:13:32Z
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-2025 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_ReferenceSortedArray_h
53 #define __PCL_ReferenceSortedArray_h
54 
56 
57 #include <pcl/Diagnostics.h>
58 
59 #include <pcl/Allocator.h>
60 #include <pcl/Container.h>
62 #include <pcl/Iterator.h>
63 #include <pcl/ReferenceArray.h>
64 #include <pcl/SortedArray.h>
65 #include <pcl/StandardAllocator.h>
66 
67 namespace pcl
68 {
69 
70 // ----------------------------------------------------------------------------
71 
99 template <typename T, class A = StandardAllocator>
100 class PCL_CLASS ReferenceSortedArray : public DirectSortedContainer<T>
101 {
102 public:
103 
107 
111 
115 
119 
123 
127 
131 
135 
139 
143 
147 
151 
152  // -------------------------------------------------------------------------
153 
157  ReferenceSortedArray() = default;
158 
166  {
167  PCL_PRECONDITION( p != nullptr )
168  if ( p != nullptr )
169  m_array = array_implementation( n, p );
170  }
171 
181  template <class FI>
182  ReferenceSortedArray( FI i, FI j )
183  : m_array( i, j )
184  {
185  Sort();
186  }
187 
192 
197 
206  {
207  }
208 
213  bool IsUnique() const
214  {
215  return m_array.IsUnique();
216  }
217 
224  bool IsAliasOf( const ReferenceSortedArray& x ) const
225  {
226  return m_array.IsAliasOf( x.m_array );
227  }
228 
238  {
239  m_array.EnsureUnique();
240  }
241 
246  size_type Size() const
247  {
248  return m_array.Size();
249  }
250 
255  {
256  return m_array.Length();
257  }
258 
265  {
266  return m_array.Capacity();
267  }
268 
277  {
278  return m_array.Available();
279  }
280 
296  bool IsValid() const
297  {
298  return m_array.IsValid();
299  }
300 
304  bool IsEmpty() const
305  {
306  return m_array.IsEmpty();
307  }
308 
314  {
315  return m_array.LowerBound();
316  }
317 
323  {
324  return m_array.UpperBound();
325  }
326 
330  const allocator& Allocator() const
331  {
332  return m_array.Allocator();
333  }
334 
338  void SetAllocator( const allocator& a )
339  {
340  m_array.SetAllocator( a );
341  }
342 
348  {
349  return m_array.At( i );
350  }
351 
357  {
358  return m_array.At( i );
359  }
360 
372  {
373  return m_array.MutableIterator( i );
374  }
375 
380  const T& operator []( size_type i ) const
381  {
382  return m_array[i];
383  }
384 
389  const T& operator *() const
390  {
391  return *m_array;
392  }
393 
398  {
399  return m_array.ConstBegin();
400  }
401 
406  {
407  return m_array.Begin();
408  }
409 
414  {
415  return m_array.ConstEnd();
416  }
417 
422  {
423  return m_array.End();
424  }
425 
433  {
434  return m_array.ConstReverseBegin();
435  }
436 
444  {
445  return m_array.ReverseBegin();
446  }
447 
456  {
457  return m_array.ConstReverseEnd();
458  }
459 
468  {
469  return m_array.ReverseEnd();
470  }
471 
476  const T& First() const
477  {
478  return m_array.First();
479  }
480 
485  T& MutableFirst()
486  {
487  return m_array.First();
488  }
489 
494  const T& Last() const
495  {
496  return m_array.Last();
497  }
498 
503  T& MutableLast()
504  {
505  return m_array.Last();
506  }
507 
518  {
519  m_array.UniquifyIterator( i );
520  }
521 
533  {
534  m_array.UniquifyIterators( i, j );
535  }
536 
537 #ifndef __PCL_NO_STL_COMPATIBLE_ITERATORS
542  {
543  return Begin();
544  }
545 
550  {
551  return End();
552  }
553 #endif // !__PCL_NO_STL_COMPATIBLE_ITERATORS
554 
563  {
564  Assign( x );
565  return *this;
566  }
567 
577  void Assign( const ReferenceSortedArray& x )
578  {
579  m_array.Assign( x.m_array );
580  }
581 
586  {
587  Transfer( x );
588  return *this;
589  }
590 
601  {
602  m_array.Transfer( x.m_array );
603  }
604 
615  {
616  m_array.Transfer( std::move( x.m_array ) );
617  }
618 
627  {
628  Assign( x );
629  return *this;
630  }
631 
639  void Assign( const array_implementation& x )
640  {
641  m_array.Assign( x );
642  Sort();
643  }
644 
652  {
653  Transfer( x );
654  return *this;
655  }
656 
667  {
668  m_array.Transfer( x );
669  Sort();
670  }
671 
682  {
683  m_array.Transfer( std::move( x ) );
684  Sort();
685  }
686 
693  void Assign( const T* p, size_type n = 1 )
694  {
695  m_array.Assign( p, n );
696  }
697 
709  template <class FI>
710  void Assign( FI i, FI j )
711  {
712  m_array.Assign( i, j );
713  Sort();
714  }
715 
727  template <class C>
728  void CloneAssign( const C& x )
729  {
730  m_array.CloneAssign( x );
731  Sort();
732  }
733 
737  {
738  m_array.CloneAssign( x.m_array );
739  }
740 
744  {
745  m_array.CloneAssign( x );
746  }
747 
751  {
752  m_array.CloneAssign( x );
753  }
754 
762  void Import( iterator i, iterator j )
763  {
764  m_array.Import( i, j );
765  Sort();
766  }
767 
780  {
781  return m_array.Release();
782  }
783 
788  {
789  return m_array;
790  }
791 
794  void Add( const ReferenceSortedArray& x )
795  {
796  const_iterator p = x.Begin(), q = x.End();
797  for ( iterator i = Begin(); i < End() && p < q; ++i )
798  if ( *p < *i )
799  i = m_array.Insert( i, (T*)p++ );
800  if ( p < q )
801  m_array.Append( p, q );
802  }
803 
806  void Add( const array_implementation& x )
807  {
808  Add( x.Begin(), x.End() );
809  }
810 
813  const_iterator Add( const T* p, size_type n = 1 )
814  {
815  if ( p != nullptr )
816  return m_array.Insert( pcl::InsertionPoint( Begin(), End(), *p ), p, n );
817  return const_iterator( nullptr );
818  }
819 
822  template <class FI>
823  void Add( FI i, FI j )
824  {
825  if ( i != j )
826  {
827  EnsureUnique();
828  for ( const_iterator l = Begin(), r = End(); ; )
829  {
830  FI h = i;
831  const_iterator m = m_array.Insert( pcl::InsertionPoint( l, r, **i ), *i );
832 
833  if ( ++i == j )
834  break;
835 
836  if ( **i < **h )
837  {
838  l = m_array.Begin();
839  r = m;
840  }
841  else
842  {
843  l = m + 1;
844  r = m_array.End();
845  }
846  }
847  }
848  }
849 
857  void Remove( const_iterator i, size_type n = 1 )
858  {
859  m_array.Remove( i, n );
860  }
861 
870  {
871  m_array.Remove( i, j );
872  }
873 
888  {
889  m_array.Truncate( i );
890  }
891 
904  void Shrink( size_type n = 1 )
905  {
906  m_array.Shrink( n );
907  }
908 
916  void Remove( const T& v )
917  {
918  m_array.Remove( v );
919  }
920 
928  template <class BP>
929  void Remove( const T& v, BP p )
930  {
931  m_array.Remove( v, p );
932  }
933 
940  void RemovePointer( const T* p )
941  {
942  m_array.RemovePointer( p );
943  }
944 
959  void Clear()
960  {
961  m_array.Clear();
962  }
963 
975  void Destroy( iterator i, size_type n = 1 )
976  {
977  m_array.Destroy( i, n );
978  }
979 
998  void Destroy( iterator i, iterator j )
999  {
1000  m_array.Destroy( i, j );
1001  }
1002 
1014  void Destroy( const T& v )
1015  {
1016  m_array.Destroy( v );
1017  }
1018 
1030  template <class BP>
1031  void Destroy( const T& v, BP p )
1032  {
1033  m_array.Destroy( v, p );
1034  }
1035 
1043  void Destroy()
1044  {
1045  m_array.Destroy();
1046  }
1047 
1055  void Reserve( size_type n )
1056  {
1057  m_array.Reserve( n );
1058  }
1059 
1072  void Squeeze()
1073  {
1074  m_array.Squeeze();
1075  }
1076 
1080  void Fill( const T& v )
1081  {
1082  m_array.Fill( v );
1083  }
1084 
1089  template <class F>
1090  void Apply( F f ) const
1091  {
1092  pcl::Apply( Begin(), End(), f );
1093  }
1094 
1100  template <class F>
1102  {
1103  return pcl::FirstThat( Begin(), End(), f );
1104  }
1105 
1111  template <class F>
1113  {
1114  return pcl::LastThat( Begin(), End(), f );
1115  }
1116 
1120  size_type Count( const T& v ) const
1121  {
1122  const_iterator i = pcl::BinarySearch( Begin(), End(), v );
1123  return (i != End()) ? pcl::InsertionPoint( i+1, End(), v ) - i : 0;
1124  }
1125 
1133  size_type Count( const T* p ) const
1134  {
1135  return m_array.Count( p );
1136  }
1137 
1142  template <class BP>
1143  size_type Count( const T& v, BP p ) const
1144  {
1145  return m_array.Count( v, p );
1146  }
1147 
1152  template <class UP>
1153  size_type CountIf( UP p ) const
1154  {
1155  return m_array.CountIf( p );
1156  }
1157 
1161  {
1162  return Begin();
1163  }
1164 
1167  template <class BP>
1168  const_iterator MinItem( BP p ) const
1169  {
1170  return pcl::MinItem( Begin(), End(), p );
1171  }
1172 
1176  {
1177  return IsEmpty() ? End() : End()-1;
1178  }
1179 
1182  template <class BP>
1183  const_iterator MaxItem( BP p ) const
1184  {
1185  return pcl::MaxItem( Begin(), End(), p );
1186  }
1187 
1190  const_iterator Search( const T& v ) const
1191  {
1192  return pcl::BinarySearch( Begin(), End(), v );
1193  }
1194 
1197  const_iterator Search( const T* p ) const
1198  {
1199  return m_array.Search( p );
1200  }
1201 
1204  template <class BP>
1205  const_iterator Search( const T& v, BP p ) const
1206  {
1207  return pcl::LinearSearch( Begin(), End(), v, p );
1208  }
1209 
1212  const_iterator SearchLast( const T& v ) const
1213  {
1214  return pcl::BinarySearchLast( Begin(), End(), v );
1215  }
1216 
1219  const_iterator SearchLast( const T* p ) const
1220  {
1221  return m_array.SearchLast( p );
1222  }
1223 
1226  template <class BP>
1227  const_iterator SearchLast( const T& v, BP p ) const
1228  {
1229  return pcl::LinearSearchLast( Begin(), End(), v, p );
1230  }
1231 
1234  bool Contains( const T& v ) const
1235  {
1236  return Search( v ) != End();
1237  }
1238 
1241  bool Contains( const T* p ) const
1242  {
1243  return m_array.Contains( p );
1244  }
1245 
1248  template <class BP>
1249  bool Contains( const T& v, BP p ) const
1250  {
1251  return Search( v, p ) != End();
1252  }
1253 
1256  void Sort()
1257  {
1258  m_array.Sort();
1259  }
1260 
1265  {
1266  pcl::Swap( x1.m_array, x2.m_array );
1267  }
1268 
1274  friend bool operator ==( const ReferenceSortedArray& x1, const ReferenceSortedArray& x2 )
1275  {
1276  return x1.m_array == x2.m_array;
1277  }
1278 
1284  friend bool operator ==( const ReferenceSortedArray& x1, const array_implementation& x2 )
1285  {
1286  return x1.m_array == x2;
1287  }
1288 
1294  friend bool operator ==( const array_implementation& x1, const ReferenceSortedArray& x2 )
1295  {
1296  return x1 == x2.m_array;
1297  }
1298 
1304  friend bool operator <( const ReferenceSortedArray& x1, const ReferenceSortedArray& x2 )
1305  {
1306  return x1.m_array < x2.m_array;
1307  }
1308 
1314  friend bool operator <( const ReferenceSortedArray& x1, const array_implementation& x2 )
1315  {
1316  return x1.m_array < x2;
1317  }
1318 
1324  friend bool operator <( const array_implementation& x1, const ReferenceSortedArray& x2 )
1325  {
1326  return x1 < x2.m_array;
1327  }
1328 
1345  template <class S, typename SP>
1346  S& ToSeparated( S& s, SP separator ) const
1347  {
1348  return m_array.ToSeparated( s, separator );
1349  }
1350 
1373  template <class S, typename SP, class AF>
1374  S& ToSeparated( S& s, SP separator, AF append ) const
1375  {
1376  return m_array.ToSeparated( s, separator, append );
1377  }
1378 
1387  template <class S>
1388  S& ToCommaSeparated( S& s ) const
1389  {
1390  return m_array.ToCommaSeparated( s );
1391  }
1392 
1401  template <class S>
1402  S& ToSpaceSeparated( S& s ) const
1403  {
1404  return m_array.ToSpaceSeparated( s );
1405  }
1406 
1415  template <class S>
1416  S& ToTabSeparated( S& s ) const
1417  {
1418  return m_array.ToTabSeparated( s );
1419  }
1420 
1429  template <class S>
1430  S& ToNewLineSeparated( S& s ) const
1431  {
1432  return m_array.ToNewLineSeparated( s );
1433  }
1434 
1445  uint64 Hash64( uint64 seed = 0 ) const
1446  {
1447  return m_array.Hash64( seed );
1448  }
1449 
1460  uint32 Hash32( uint32 seed = 0 ) const
1461  {
1462  return m_array.Hash32( seed );
1463  }
1464 
1469  uint64 Hash( uint64 seed = 0 ) const
1470  {
1471  return Hash64( seed );
1472  }
1473 
1474 private:
1475 
1476  array_implementation m_array;
1477 };
1478 
1479 // ----------------------------------------------------------------------------
1480 
1488 template <class T, class A, class V> inline
1489 ReferenceSortedArray<T,A>& operator <<( ReferenceSortedArray<T,A>& x, const V* p )
1490 {
1491  x.Add( static_cast<const T*>( p ) );
1492  return x;
1493 }
1494 
1502 template <class T, class A, class V> inline
1503 ReferenceSortedArray<T,A>& operator <<( ReferenceSortedArray<T,A>&& x, const V* p )
1504 {
1505  x.Add( static_cast<const T*>( p ) );
1506  return x;
1507 }
1508 
1514 template <class T, class A> inline
1515 ReferenceSortedArray<T,A>& operator <<( ReferenceSortedArray<T,A>& x1, const ReferenceSortedArray<T,A>& x2 )
1516 {
1517  x1.Add( x2 );
1518  return x1;
1519 }
1520 
1526 template <class T, class A> inline
1527 ReferenceSortedArray<T,A>& operator <<( ReferenceSortedArray<T,A>&& x1, const ReferenceSortedArray<T,A>& x2 )
1528 {
1529  x1.Add( x2 );
1530  return x1;
1531 }
1532 
1538 template <class T, class A> inline
1539 ReferenceSortedArray<T,A>& operator <<( ReferenceSortedArray<T,A>& x1, const ReferenceArray<T,A>& x2 )
1540 {
1541  x1.Add( x2 );
1542  return x1;
1543 }
1544 
1550 template <class T, class A> inline
1551 ReferenceSortedArray<T,A>& operator <<( ReferenceSortedArray<T,A>&& x1, const ReferenceArray<T,A>& x2 )
1552 {
1553  x1.Add( x2 );
1554  return x1;
1555 }
1556 
1557 // ----------------------------------------------------------------------------
1558 
1559 } // pcl
1560 
1561 #endif // __PCL_ReferenceSortedArray_h
1562 
1563 // ----------------------------------------------------------------------------
1564 // EOF pcl/ReferenceSortedArray.h - Released 2025-02-21T12:13:32Z
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
Generic dynamic sorted array of pointers to objects.
Immutable ReferenceArray iterator.
Mutable ReferenceArray iterator.
Dynamic array of pointers to objects providing direct iteration and element access by reference.
typename array_implementation::iterator indirect_iterator
typename array_implementation::const_iterator const_indirect_iterator
typename array_implementation::allocator allocator
typename array_implementation::block_allocator block_allocator
Dynamic sorted array of pointers to objects providing direct iteration and element access by referenc...
const_iterator MinItem() const
ReferenceSortedArray(ReferenceSortedArray &&)=default
void Remove(const_iterator i, const_iterator j)
void Assign(const ReferenceSortedArray &x)
typename array_implementation::block_allocator block_allocator
iterator MutableIterator(const_iterator i)
const_iterator MaxItem(BP p) const
void Destroy(iterator i, iterator j)
friend void Swap(ReferenceSortedArray &x1, ReferenceSortedArray &x2)
void Truncate(const_iterator i)
reverse_iterator MutableReverseEnd()
const_iterator Search(const T &v) const
void Transfer(ReferenceSortedArray &&x)
void Add(const ReferenceSortedArray &x)
void Assign(const T *p, size_type n=1)
typename array_implementation::const_reverse_iterator const_reverse_iterator
typename array_implementation::const_indirect_iterator const_indirect_iterator
void Destroy(const T &v, BP p)
void Transfer(array_implementation &x)
const_iterator End() const
void UniquifyIterators(iterator &i, iterator &j)
ReferenceSortedArray(const ReferenceSortedArray &)=default
bool IsAliasOf(const ReferenceSortedArray &x) const
void Assign(const array_implementation &x)
typename array_implementation::const_iterator const_iterator
bool Contains(const T &v) const
void Destroy(iterator i, size_type n=1)
void CloneAssign(ReferenceSortedArray &x)
void Transfer(ReferenceSortedArray &x)
const_iterator SearchLast(const T *p) const
bool Contains(const T *p) const
const_iterator Add(const T *p, size_type n=1)
void UniquifyIterator(iterator &i)
size_type Count(const T *p) const
uint32 Hash32(uint32 seed=0) const
array_implementation ToUnsorted() const
bool Contains(const T &v, BP p) const
typename array_implementation::iterator iterator
uint64 Hash(uint64 seed=0) const
ReferenceSortedArray(size_type n, const T *p)
const_iterator SearchLast(const T &v) const
const_iterator Search(const T &v, BP p) const
size_type Count(const T &v, BP p) const
typename array_implementation::allocator allocator
const_iterator Search(const T *p) const
const_reverse_iterator ReverseEnd() const
typename array_implementation::indirect_iterator indirect_iterator
const_iterator SearchLast(const T &v, BP p) const
const_iterator end() const
uint64 Hash64(uint64 seed=0) const
const allocator & Allocator() const
void Remove(const_iterator i, size_type n=1)
const_reverse_iterator ReverseBegin() const
void Remove(const T &v, BP p)
void Import(iterator i, iterator j)
const_iterator MinItem(BP p) const
const_iterator begin() const
void CloneAssign(IndirectSortedArray< T, A > &x)
const_iterator MaxItem() const
typename array_implementation::reverse_iterator reverse_iterator
size_type CountIf(UP p) const
void Transfer(array_implementation &&x)
const_iterator Begin() const
iterator MutableAt(size_type i)
reverse_iterator MutableReverseBegin()
void SetAllocator(const allocator &a)
const_iterator At(size_type i) const
void Add(const array_implementation &x)
const_iterator LastThat(F f) const
size_type Count(const T &v) const
void CloneAssign(SortedArray< T, A > &x)
const_iterator FirstThat(F f) const
Reverse random access iterator.
Definition: Iterator.h:420
Generic dynamic sorted array.
Definition: SortedArray.h:83
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 LinearSearch(FI i, FI j, const T &v) noexcept
Definition: Search.h:91
FI BinarySearchLast(FI i, FI j, const T &v) noexcept
Definition: Search.h:238
BI LinearSearchLast(BI i, BI j, const T &v) noexcept
Definition: Search.h:129
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