PCL
ReferenceSortedArray.h
Go to the documentation of this file.
1 // ____ ______ __
2 // / __ \ / ____// /
3 // / /_/ // / / /
4 // / ____// /___ / /___ PixInsight Class Library
5 // /_/ \____//_____/ PCL 2.8.5
6 // ----------------------------------------------------------------------------
7 // pcl/ReferenceSortedArray.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_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 
786  void Add( const ReferenceSortedArray& x )
787  {
788  const_iterator p = x.Begin(), q = x.End();
789  for ( iterator i = Begin(); i < End() && p < q; ++i )
790  if ( *p < *i )
791  i = m_array.Insert( i, (T*)p++ );
792  if ( p < q )
793  m_array.Append( p, q );
794  }
795 
798  void Add( const array_implementation& x )
799  {
800  Add( x.Begin(), x.End() );
801  }
802 
805  const_iterator Add( const T* p, size_type n = 1 )
806  {
807  if ( p != nullptr )
808  return m_array.Insert( pcl::InsertionPoint( Begin(), End(), *p ), p, n );
809  return const_iterator( nullptr );
810  }
811 
814  template <class FI>
815  void Add( FI i, FI j )
816  {
817  if ( i != j )
818  {
819  EnsureUnique();
820  for ( const_iterator l = Begin(), r = End(); ; )
821  {
822  FI h = i;
823  const_iterator m = m_array.Insert( pcl::InsertionPoint( l, r, **i ), *i );
824 
825  if ( ++i == j )
826  break;
827 
828  if ( **i < **h )
829  {
830  l = m_array.Begin();
831  r = m;
832  }
833  else
834  {
835  l = m + 1;
836  r = m_array.End();
837  }
838  }
839  }
840  }
841 
849  void Remove( const_iterator i, size_type n = 1 )
850  {
851  m_array.Remove( i, n );
852  }
853 
862  {
863  m_array.Remove( i, j );
864  }
865 
880  {
881  m_array.Truncate( i );
882  }
883 
896  void Shrink( size_type n = 1 )
897  {
898  m_array.Shrink( n );
899  }
900 
908  void Remove( const T& v )
909  {
910  m_array.Remove( v );
911  }
912 
920  template <class BP>
921  void Remove( const T& v, BP p )
922  {
923  m_array.Remove( v, p );
924  }
925 
932  void RemovePointer( const T* p )
933  {
934  m_array.RemovePointer( p );
935  }
936 
951  void Clear()
952  {
953  m_array.Clear();
954  }
955 
967  void Destroy( iterator i, size_type n = 1 )
968  {
969  m_array.Destroy( i, n );
970  }
971 
990  void Destroy( iterator i, iterator j )
991  {
992  m_array.Destroy( i, j );
993  }
994 
1006  void Destroy( const T& v )
1007  {
1008  m_array.Destroy( v );
1009  }
1010 
1022  template <class BP>
1023  void Destroy( const T& v, BP p )
1024  {
1025  m_array.Destroy( v, p );
1026  }
1027 
1035  void Destroy()
1036  {
1037  m_array.Destroy();
1038  }
1039 
1047  void Reserve( size_type n )
1048  {
1049  m_array.Reserve( n );
1050  }
1051 
1064  void Squeeze()
1065  {
1066  m_array.Squeeze();
1067  }
1068 
1072  void Fill( const T& v )
1073  {
1074  m_array.Fill( v );
1075  }
1076 
1081  template <class F>
1082  void Apply( F f ) const
1083  {
1084  pcl::Apply( Begin(), End(), f );
1085  }
1086 
1092  template <class F>
1094  {
1095  return pcl::FirstThat( Begin(), End(), f );
1096  }
1097 
1103  template <class F>
1105  {
1106  return pcl::LastThat( Begin(), End(), f );
1107  }
1108 
1112  size_type Count( const T& v ) const
1113  {
1114  const_iterator i = pcl::BinarySearch( Begin(), End(), v );
1115  return (i != End()) ? pcl::InsertionPoint( i+1, End(), v ) - i : 0;
1116  }
1117 
1125  size_type Count( const T* p ) const
1126  {
1127  return m_array.Count( p );
1128  }
1129 
1134  template <class BP>
1135  size_type Count( const T& v, BP p ) const
1136  {
1137  return m_array.Count( v, p );
1138  }
1139 
1144  template <class UP>
1145  size_type CountIf( UP p ) const
1146  {
1147  return m_array.CountIf( p );
1148  }
1149 
1153  {
1154  return Begin();
1155  }
1156 
1159  template <class BP>
1160  const_iterator MinItem( BP p ) const
1161  {
1162  return pcl::MinItem( Begin(), End(), p );
1163  }
1164 
1168  {
1169  return IsEmpty() ? End() : End()-1;
1170  }
1171 
1174  template <class BP>
1175  const_iterator MaxItem( BP p ) const
1176  {
1177  return pcl::MaxItem( Begin(), End(), p );
1178  }
1179 
1182  const_iterator Search( const T& v ) const
1183  {
1184  return pcl::BinarySearch( Begin(), End(), v );
1185  }
1186 
1189  const_iterator Search( const T* p ) const
1190  {
1191  return m_array.Search( p );
1192  }
1193 
1196  template <class BP>
1197  const_iterator Search( const T& v, BP p ) const
1198  {
1199  return pcl::LinearSearch( Begin(), End(), v, p );
1200  }
1201 
1204  const_iterator SearchLast( const T& v ) const
1205  {
1206  return pcl::BinarySearchLast( Begin(), End(), v );
1207  }
1208 
1211  const_iterator SearchLast( const T* p ) const
1212  {
1213  return m_array.SearchLast( p );
1214  }
1215 
1218  template <class BP>
1219  const_iterator SearchLast( const T& v, BP p ) const
1220  {
1221  return pcl::LinearSearchLast( Begin(), End(), v, p );
1222  }
1223 
1226  bool Contains( const T& v ) const
1227  {
1228  return Search( v ) != End();
1229  }
1230 
1233  bool Contains( const T* p ) const
1234  {
1235  return m_array.Contains( p );
1236  }
1237 
1240  template <class BP>
1241  bool Contains( const T& v, BP p ) const
1242  {
1243  return Search( v, p ) != End();
1244  }
1245 
1248  void Sort()
1249  {
1250  m_array.Sort();
1251  }
1252 
1257  {
1258  pcl::Swap( x1.m_array, x2.m_array );
1259  }
1260 
1266  friend bool operator ==( const ReferenceSortedArray& x1, const ReferenceSortedArray& x2 )
1267  {
1268  return x1.m_array == x2.m_array;
1269  }
1270 
1276  friend bool operator ==( const ReferenceSortedArray& x1, const array_implementation& x2 )
1277  {
1278  return x1.m_array == x2;
1279  }
1280 
1286  friend bool operator ==( const array_implementation& x1, const ReferenceSortedArray& x2 )
1287  {
1288  return x1 == x2.m_array;
1289  }
1290 
1296  friend bool operator <( const ReferenceSortedArray& x1, const ReferenceSortedArray& x2 )
1297  {
1298  return x1.m_array < x2.m_array;
1299  }
1300 
1306  friend bool operator <( const ReferenceSortedArray& x1, const array_implementation& x2 )
1307  {
1308  return x1.m_array < x2;
1309  }
1310 
1316  friend bool operator <( const array_implementation& x1, const ReferenceSortedArray& x2 )
1317  {
1318  return x1 < x2.m_array;
1319  }
1320 
1337  template <class S, typename SP>
1338  S& ToSeparated( S& s, SP separator ) const
1339  {
1340  return m_array.ToSeparated( s, separator );
1341  }
1342 
1365  template <class S, typename SP, class AF>
1366  S& ToSeparated( S& s, SP separator, AF append ) const
1367  {
1368  return m_array.ToSeparated( s, separator, append );
1369  }
1370 
1379  template <class S>
1380  S& ToCommaSeparated( S& s ) const
1381  {
1382  return m_array.ToCommaSeparated( s );
1383  }
1384 
1393  template <class S>
1394  S& ToSpaceSeparated( S& s ) const
1395  {
1396  return m_array.ToSpaceSeparated( s );
1397  }
1398 
1407  template <class S>
1408  S& ToTabSeparated( S& s ) const
1409  {
1410  return m_array.ToTabSeparated( s );
1411  }
1412 
1421  template <class S>
1422  S& ToNewLineSeparated( S& s ) const
1423  {
1424  return m_array.ToNewLineSeparated( s );
1425  }
1426 
1437  uint64 Hash64( uint64 seed = 0 ) const
1438  {
1439  return m_array.Hash64( seed );
1440  }
1441 
1452  uint32 Hash32( uint32 seed = 0 ) const
1453  {
1454  return m_array.Hash32( seed );
1455  }
1456 
1461  uint64 Hash( uint64 seed = 0 ) const
1462  {
1463  return Hash64( seed );
1464  }
1465 
1466 private:
1467 
1468  array_implementation m_array;
1469 };
1470 
1471 // ----------------------------------------------------------------------------
1472 
1480 template <class T, class A, class V> inline
1481 ReferenceSortedArray<T,A>& operator <<( ReferenceSortedArray<T,A>& x, const V* p )
1482 {
1483  x.Add( static_cast<const T*>( p ) );
1484  return x;
1485 }
1486 
1494 template <class T, class A, class V> inline
1495 ReferenceSortedArray<T,A>& operator <<( ReferenceSortedArray<T,A>&& x, const V* p )
1496 {
1497  x.Add( static_cast<const T*>( p ) );
1498  return x;
1499 }
1500 
1506 template <class T, class A> inline
1507 ReferenceSortedArray<T,A>& operator <<( ReferenceSortedArray<T,A>& x1, const ReferenceSortedArray<T,A>& x2 )
1508 {
1509  x1.Add( x2 );
1510  return x1;
1511 }
1512 
1518 template <class T, class A> inline
1519 ReferenceSortedArray<T,A>& operator <<( ReferenceSortedArray<T,A>&& x1, const ReferenceSortedArray<T,A>& x2 )
1520 {
1521  x1.Add( x2 );
1522  return x1;
1523 }
1524 
1530 template <class T, class A> inline
1531 ReferenceSortedArray<T,A>& operator <<( ReferenceSortedArray<T,A>& x1, const ReferenceArray<T,A>& x2 )
1532 {
1533  x1.Add( x2 );
1534  return x1;
1535 }
1536 
1542 template <class T, class A> inline
1543 ReferenceSortedArray<T,A>& operator <<( ReferenceSortedArray<T,A>&& x1, const ReferenceArray<T,A>& x2 )
1544 {
1545  x1.Add( x2 );
1546  return x1;
1547 }
1548 
1549 // ----------------------------------------------------------------------------
1550 
1551 } // pcl
1552 
1553 #endif // __PCL_ReferenceSortedArray_h
1554 
1555 // ----------------------------------------------------------------------------
1556 // EOF pcl/ReferenceSortedArray.h - Released 2024-12-28T16:53:48Z
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
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