PCL
Array.h
Go to the documentation of this file.
1 // ____ ______ __
2 // / __ \ / ____// /
3 // / /_/ // / / /
4 // / ____// /___ / /___ PixInsight Class Library
5 // /_/ \____//_____/ PCL 2.6.5
6 // ----------------------------------------------------------------------------
7 // pcl/Array.h - Released 2024-01-13T15:47:58Z
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_Array_h
53 #define __PCL_Array_h
54 
56 
57 #include <pcl/Defs.h>
58 #include <pcl/Diagnostics.h>
59 
60 #include <pcl/Allocator.h>
61 #include <pcl/Container.h>
62 #include <pcl/Indirect.h>
63 #include <pcl/Iterator.h>
64 #include <pcl/Math.h>
65 #include <pcl/Memory.h>
66 #include <pcl/ReferenceCounter.h>
67 #include <pcl/Relational.h>
68 #include <pcl/Rotate.h>
69 #include <pcl/Search.h>
70 #include <pcl/Sort.h>
71 #include <pcl/StandardAllocator.h>
72 #include <pcl/Utility.h>
73 
74 namespace pcl
75 {
76 
77 // ----------------------------------------------------------------------------
78 
83 // ----------------------------------------------------------------------------
84 
98 template <class T, class A = StandardAllocator>
99 class PCL_CLASS Array : public DirectContainer<T>
100 {
101 public:
102 
105  using block_allocator = A;
106 
110 
113  using iterator = T*;
114 
117  using const_iterator = const T*;
118 
122 
126 
127  // -------------------------------------------------------------------------
128 
133  {
134  m_data = new Data;
135  }
136 
140  explicit
142  {
143  m_data = new Data;
144  m_data->Allocate( n );
145  m_data->Initialize( m_data->begin, m_data->end );
146  }
147 
151  Array( size_type n, const T& v )
152  {
153  m_data = new Data;
154  m_data->Allocate( n );
155  m_data->Initialize( m_data->begin, m_data->end, v );
156  }
157 
162  template <class FI>
163  Array( FI i, FI j )
164  {
165  m_data = new Data;
166  m_data->Allocate( size_type( pcl::Distance( i, j ) ) );
167  if ( m_data->begin != nullptr )
168  m_data->Build( m_data->begin, i, j );
169  }
170 
179  template <typename T1>
180  Array( std::initializer_list<T1> l )
181  : Array( l.begin(), l.end() )
182  {
183  }
184 
188  Array( const Array& x )
189  : m_data( x.m_data )
190  {
191  if ( m_data != nullptr )
192  m_data->Attach();
193  }
194 
198  Array( Array&& x )
199  : m_data( x.m_data )
200  {
201  x.m_data = nullptr;
202  }
203 
209  {
210  if ( m_data != nullptr )
211  {
212  DetachFromData();
213  m_data = nullptr;
214  }
215  }
216 
220  bool IsUnique() const noexcept
221  {
222  return m_data->IsUnique();
223  }
224 
230  bool IsAliasOf( const Array& x ) const noexcept
231  {
232  return m_data == x.m_data;
233  }
234 
243  {
244  if ( !IsUnique() )
245  {
246  Data* newData = new Data;
247  newData->Allocate( Length() );
248  newData->Build( newData->begin, m_data->begin, m_data->end );
249  DetachFromData();
250  m_data = newData;
251  }
252  }
253 
258  size_type Size() const noexcept
259  {
260  return m_data->Size();
261  }
262 
266  size_type Length() const noexcept
267  {
268  return m_data->Length();
269  }
270 
275  size_type Capacity() const noexcept
276  {
277  return m_data->Capacity();
278  }
279 
286  size_type Available() const noexcept
287  {
288  return m_data->Available();
289  }
290 
304  bool IsValid() const noexcept
305  {
306  return m_data != nullptr;
307  }
308 
312  bool IsEmpty() const noexcept
313  {
314  return m_data->IsEmpty();
315  }
316 
321  size_type LowerBound() const noexcept
322  {
323  return 0;
324  }
325 
330  size_type UpperBound() const noexcept
331  {
332  return Length()-1;
333  }
334 
338  const allocator& Allocator() const noexcept
339  {
340  return m_data->alloc;
341  }
342 
346  void SetAllocator( const allocator& a )
347  {
348  EnsureUnique();
349  m_data->alloc = a;
350  }
351 
356  {
357  PCL_PRECONDITION( !IsEmpty() && i < Length() )
358  EnsureUnique();
359  return m_data->begin + i;
360  }
361 
365  const_iterator At( size_type i ) const noexcept
366  {
367  PCL_PRECONDITION( !IsEmpty() && i < Length() )
368  return m_data->begin + i;
369  }
370 
382  {
383  return At( i - m_data->begin );
384  }
385 
390  T& operator []( size_type i )
391  {
392  return *At( i );
393  }
394 
399  const T& operator []( size_type i ) const noexcept
400  {
401  return *At( i );
402  }
403 
408  {
409  PCL_PRECONDITION( m_data->begin != nullptr )
410  EnsureUnique();
411  return *m_data->begin;
412  }
413 
417  const T& operator *() const noexcept
418  {
419  PCL_PRECONDITION( m_data->begin != nullptr )
420  return *m_data->begin;
421  }
422 
427  {
428  EnsureUnique();
429  return m_data->begin;
430  }
431 
435  const_iterator Begin() const noexcept
436  {
437  return m_data->begin;
438  }
439 
443  const_iterator ConstBegin() const noexcept
444  {
445  return m_data->begin;
446  }
447 
452  {
453  EnsureUnique();
454  return m_data->end;
455  }
456 
460  const_iterator End() const noexcept
461  {
462  return m_data->end;
463  }
464 
468  const_iterator ConstEnd() const noexcept
469  {
470  return m_data->end;
471  }
472 
480  {
481  PCL_PRECONDITION( m_data->end != nullptr )
482  EnsureUnique();
483  return m_data->end - 1;
484  }
485 
493  {
494  PCL_PRECONDITION( m_data->end != nullptr )
495  return m_data->end - 1;
496  }
497 
505  {
506  PCL_PRECONDITION( m_data->end != nullptr )
507  return m_data->end - 1;
508  }
509 
518  {
519  PCL_PRECONDITION( m_data->begin != nullptr )
520  EnsureUnique();
521  return m_data->begin - 1;
522  }
523 
532  {
533  PCL_PRECONDITION( m_data->begin != nullptr )
534  return m_data->begin - 1;
535  }
536 
545  {
546  PCL_PRECONDITION( m_data->begin != nullptr )
547  return m_data->begin - 1;
548  }
549 
559  {
560  PCL_PRECONDITION( i >= m_data->begin && i <= m_data->end )
561  if ( !IsUnique() )
562  {
563  distance_type d = i - m_data->begin;
564  EnsureUnique();
565  i = m_data->begin + d;
566  }
567  }
568 
579  {
580  PCL_PRECONDITION( i >= m_data->begin && i <= m_data->end )
581  PCL_PRECONDITION( j >= m_data->begin && j <= m_data->end )
582  if ( !IsUnique() )
583  {
584  distance_type d = i - m_data->begin;
585  distance_type r = j - i;
586  EnsureUnique();
587  j = (i = m_data->begin + d) + r;
588  }
589  }
590 
591 #ifndef __PCL_NO_STL_COMPATIBLE_ITERATORS
592 
596  {
597  return Begin();
598  }
599 
603  const_iterator begin() const noexcept
604  {
605  return Begin();
606  }
607 
612  {
613  return End();
614  }
615 
619  const_iterator end() const noexcept
620  {
621  return End();
622  }
623 #endif // !__PCL_NO_STL_COMPATIBLE_ITERATORS
624 
631  Array& operator =( const Array& x )
632  {
633  Assign( x );
634  return *this;
635  }
636 
646  void Assign( const Array& x )
647  {
648  x.m_data->Attach();
649  DetachFromData();
650  m_data = x.m_data;
651  }
652 
656  Array& operator =( Array&& x )
657  {
658  Transfer( x );
659  return *this;
660  }
661 
671  void Transfer( Array& x )
672  {
673  DetachFromData();
674  m_data = x.m_data;
675  x.m_data = nullptr;
676  }
677 
687  void Transfer( Array&& x )
688  {
689  DetachFromData();
690  m_data = x.m_data;
691  x.m_data = nullptr;
692  }
693 
698  void Assign( const T& v, size_type n = 1 )
699  {
700  if ( n > 0 )
701  {
702  if ( !IsUnique() )
703  {
704  Data* newData = new Data;
705  DetachFromData();
706  m_data = newData;
707  }
708 
709  if ( Capacity() < n )
710  {
711  m_data->Deallocate();
712  m_data->Allocate( n );
713  }
714  else
715  {
716  m_data->Destroy( m_data->begin, m_data->end );
717  m_data->end = m_data->begin + n;
718  }
719 
720  m_data->Initialize( m_data->begin, m_data->end, v );
721  }
722  else
723  Clear();
724  }
725 
732  template <class FI>
733  void Assign( FI i, FI j )
734  {
735  size_type n = size_type( pcl::Distance( i, j ) );
736  if ( n > 0 )
737  {
738  if ( !IsUnique() )
739  {
740  Data* newData = new Data;
741  DetachFromData();
742  m_data = newData;
743  }
744 
745  if ( Capacity() < n )
746  {
747  m_data->Deallocate();
748  m_data->Allocate( n );
749  }
750  else
751  {
752  m_data->Destroy( m_data->begin, m_data->end );
753  m_data->end = m_data->begin + n;
754  }
755 
756  m_data->Build( m_data->begin, i, j );
757  }
758  else
759  Clear();
760  }
761 
771  void Import( iterator i, iterator j )
772  {
773  if ( i >= m_data->available || j <= m_data->begin )
774  {
775  Clear();
776  size_type n = size_type( pcl::Distance( i, j ) );
777  if ( n > 0 )
778  {
779  EnsureUnique();
780  m_data->begin = i;
781  m_data->end = m_data->available = j;
782  }
783  }
784  }
785 
799  {
800  EnsureUnique();
801  iterator b = m_data->begin;
802  m_data->begin = m_data->end = m_data->available = nullptr;
803  return b;
804  }
805 
817  {
818  i = pcl::Range( i, m_data->begin, m_data->end );
819  if ( n > 0 )
820  {
821  UniquifyIterator( i );
822  m_data->Initialize( i = m_data->UninitializedGrow( i, n ), n );
823  }
824  return i;
825  }
826 
837  {
838  return Grow( m_data->end, n );
839  }
840 
850  void Shrink( size_type n = 1 )
851  {
852  if ( n < m_data->Length() )
853  Truncate( m_data->end - n );
854  else
855  Clear();
856  }
857 
870  void Resize( size_type n )
871  {
872  size_type l = m_data->Length();
873  if ( n > l )
874  Expand( n - l );
875  else
876  Shrink( l - n );
877  }
878 
890  iterator Insert( iterator i, const Array& x )
891  {
892  if ( &x != this )
893  return Insert( i, x.Begin(), x.End() );
894  Array t( *this );
895  t.EnsureUnique();
896  return Insert( i, t.m_data->begin, t.m_data->end );
897  }
898 
909  iterator Insert( iterator i, const T& v, size_type n = 1 )
910  {
911  i = pcl::Range( i, m_data->begin, m_data->end );
912  if ( n > 0 )
913  {
914  UniquifyIterator( i );
915  m_data->Initialize( i = m_data->UninitializedGrow( i, n ), n, v );
916  }
917  return i;
918  }
919 
932  template <class FI>
933  iterator Insert( iterator i, FI p, FI q )
934  {
935  i = pcl::Range( i, m_data->begin, m_data->end );
936  size_type n = size_type( pcl::Distance( p, q ) );
937  if ( n > 0 )
938  {
939  UniquifyIterator( i );
940  m_data->Build( i = m_data->UninitializedGrow( i, n ), p, q );
941  }
942  return i;
943  }
944 
948  void Append( const Array& x )
949  {
950  Insert( m_data->end, x );
951  }
952 
957  void Append( const T& v, size_type n = 1 )
958  {
959  Insert( m_data->end, v, n );
960  }
961 
968  template <class FI>
969  void Append( FI p, FI q )
970  {
971  Insert( m_data->end, p, q );
972  }
973 
978  void Prepend( const Array& x )
979  {
980  Insert( m_data->begin, x );
981  }
982 
987  void Prepend( const T& v, size_type n = 1 )
988  {
989  Insert( m_data->begin, v, n );
990  }
991 
998  template <class FI>
999  void Prepend( FI p, FI q )
1000  {
1001  Insert( m_data->begin, p, q );
1002  }
1003 
1007  void Add( const Array& x )
1008  {
1009  Append( x );
1010  }
1011 
1015  void Add( const T& v, size_type n = 1 )
1016  {
1017  Append( v, n );
1018  }
1019 
1023  template <class FI>
1024  void Add( FI p, FI q )
1025  {
1026  Append( p, q );
1027  }
1028 
1038  void Remove( iterator i, size_type n = 1 )
1039  {
1040  Remove( i, i+n );
1041  }
1042 
1052  void Remove( iterator i, iterator j )
1053  {
1054  if ( i < m_data->end )
1055  if ( i < j )
1056  {
1057  i = pcl::Max( m_data->begin, i );
1058  j = pcl::Min( j, m_data->end );
1059  if ( i > m_data->begin || j < m_data->end )
1060  {
1061  UniquifyIterators( i, j );
1062  m_data->Destroy( j = pcl::Copy( i, j, m_data->end ), m_data->end );
1063  m_data->end = j;
1064  }
1065  else
1066  Clear();
1067  }
1068  }
1069 
1080  void Truncate( iterator i )
1081  {
1082  Remove( i, m_data->end );
1083  }
1084 
1089  void Remove( const T& v )
1090  {
1091  Array a;
1092  for ( iterator i = m_data->begin, j = i; ; ++j )
1093  {
1094  if ( j == m_data->end )
1095  {
1096  if ( i != m_data->begin )
1097  {
1098  a.Add( i, j );
1099  Transfer( a );
1100  }
1101  break;
1102  }
1103 
1104  if ( *j == v )
1105  {
1106  a.Add( i, j );
1107  i = j;
1108  ++i;
1109  }
1110  }
1111  }
1112 
1117  template <class BP>
1118  void Remove( const T& v, BP p )
1119  {
1120  Array a;
1121  for ( iterator i = m_data->begin, j = i; ; ++j )
1122  {
1123  if ( j == m_data->end )
1124  {
1125  if ( i != m_data->begin )
1126  {
1127  a.Add( i, j );
1128  Transfer( a );
1129  }
1130  break;
1131  }
1132 
1133  if ( p( *j, v ) )
1134  {
1135  a.Add( i, j );
1136  i = j;
1137  ++i;
1138  }
1139  }
1140  }
1141 
1153  void Clear()
1154  {
1155  if ( !IsEmpty() )
1156  if ( IsUnique() )
1157  m_data->Deallocate();
1158  else
1159  {
1160  Data* newData = new Data;
1161  DetachFromData();
1162  m_data = newData;
1163  }
1164  }
1165 
1180  {
1181  if ( &x != this )
1182  return Replace( i, j, x.Begin(), x.End() );
1183  Array t( *this );
1184  t.EnsureUnique();
1185  return Replace( i, j, t.ConstBegin(), t.ConstEnd() );
1186  }
1187 
1201  iterator Replace( iterator i, iterator j, const T& v, size_type n = 1 )
1202  {
1203  i = pcl::Range( i, m_data->begin, m_data->end );
1204  j = pcl::Range( j, m_data->begin, m_data->end );
1205  if ( i < j )
1206  if ( i < m_data->end )
1207  {
1208  UniquifyIterators( i, j );
1209  size_type d = size_type( j - i );
1210  if ( d < n )
1211  {
1212  m_data->Destroy( i, j );
1213  m_data->Initialize( i = m_data->UninitializedGrow( i, n-d ), n, v );
1214  }
1215  else
1216  {
1217  iterator k = i + n;
1218  pcl::Fill( i, k, v );
1219  Remove( k, j );
1220  if ( m_data->begin == nullptr )
1221  i = nullptr;
1222  }
1223  }
1224  return i;
1225  }
1226 
1243  template <class FI>
1244  iterator Replace( iterator i, iterator j, FI p, FI q )
1245  {
1246  i = pcl::Range( i, m_data->begin, m_data->end );
1247  j = pcl::Range( j, m_data->begin, m_data->end );
1248  if ( i < j )
1249  if ( i < m_data->end )
1250  {
1251  UniquifyIterators( i, j );
1252  size_type d = size_type( j - i );
1253  size_type n = size_type( pcl::Distance( p, q ) );
1254  if ( d < n )
1255  {
1256  m_data->Destroy( i, j );
1257  m_data->Build( i = m_data->UninitializedGrow( i, n-d ), p, q );
1258  }
1259  else
1260  {
1261  Remove( pcl::Move( i, p, q ), j );
1262  if ( m_data->begin == nullptr )
1263  i = nullptr;
1264  }
1265  }
1266  return i;
1267  }
1268 
1275  void Reserve( size_type n )
1276  {
1277  if ( n > 0 )
1278  if ( IsUnique() )
1279  {
1280  if ( Capacity() < n )
1281  {
1282  iterator b = m_data->alloc.Allocate( n );
1283  iterator e = m_data->Build( b, m_data->begin, m_data->end );
1284  m_data->Deallocate();
1285  m_data->begin = b;
1286  m_data->end = e;
1287  m_data->available = m_data->begin + n;
1288  }
1289  }
1290  else
1291  {
1292  Data* newData = new Data;
1293  newData->begin = newData->alloc.Allocate( n = pcl::Max( Length(), n ) );
1294  newData->end = newData->Build( newData->begin, m_data->begin, m_data->end );
1295  newData->available = newData->begin + n;
1296  DetachFromData();
1297  m_data = newData;
1298  }
1299  }
1300 
1313  void Squeeze()
1314  {
1315  if ( IsUnique() )
1316  {
1317  if ( Available() > 0 )
1318  {
1319  iterator b = m_data->alloc.Allocate( Length() );
1320  iterator e = m_data->Build( b, m_data->begin, m_data->end );
1321  m_data->Deallocate();
1322  m_data->begin = b;
1323  m_data->end = m_data->available = e;
1324  }
1325  }
1326  else
1327  {
1328  Data* newData = new Data;
1329  if ( !IsEmpty() )
1330  {
1331  newData->begin = newData->alloc.Allocate( Length() );
1332  newData->available = newData->end = newData->Build( newData->begin, m_data->begin, m_data->end );
1333  }
1334  DetachFromData();
1335  m_data = newData;
1336  }
1337  }
1338 
1342  void Fill( const T& v )
1343  {
1344  EnsureUnique();
1345  pcl::Fill( m_data->begin, m_data->end, v );
1346  }
1347 
1360  void SecureFill( const T& v )
1361  {
1362  pcl::Fill( m_data->begin, m_data->end, v );
1363  }
1364 
1369  template <class F>
1370  void Apply( F f )
1371  {
1372  EnsureUnique();
1373  pcl::Apply( m_data->begin, m_data->end, f );
1374  }
1375 
1380  template <class F>
1381  void Apply( F f ) const noexcept( noexcept( f ) )
1382  {
1383  pcl::Apply( m_data->begin, m_data->end, f );
1384  }
1385 
1391  template <class F>
1392  iterator FirstThat( F f ) const noexcept( noexcept( f ) )
1393  {
1394  return const_cast<iterator>( pcl::FirstThat( m_data->begin, m_data->end, f ) );
1395  }
1396 
1402  template <class F>
1403  iterator LastThat( F f ) const noexcept( noexcept( f ) )
1404  {
1405  return const_cast<iterator>( pcl::LastThat( m_data->begin, m_data->end, f ) );
1406  }
1407 
1410  size_type Count( const T& v ) const noexcept
1411  {
1412  return pcl::Count( m_data->begin, m_data->end, v );
1413  }
1414 
1417  template <class BP>
1418  size_type Count( const T& v, BP p ) const noexcept( noexcept( p ) )
1419  {
1420  return pcl::Count( m_data->begin, m_data->end, v, p );
1421  }
1422 
1425  template <class UP>
1426  size_type CountIf( UP p ) const noexcept( noexcept( p ) )
1427  {
1428  return pcl::CountIf( m_data->begin, m_data->end, p );
1429  }
1430 
1433  iterator MinItem() const noexcept
1434  {
1435  return const_cast<iterator>( pcl::MinItem( m_data->begin, m_data->end ) );
1436  }
1437 
1440  template <class BP>
1441  iterator MinItem( BP p ) const noexcept( noexcept( p ) )
1442  {
1443  return const_cast<iterator>( pcl::MinItem( m_data->begin, m_data->end, p ) );
1444  }
1445 
1448  iterator MaxItem() const noexcept
1449  {
1450  return const_cast<iterator>( pcl::MaxItem( m_data->begin, m_data->end ) );
1451  }
1452 
1455  template <class BP>
1456  iterator MaxItem( BP p ) const noexcept( noexcept( p ) )
1457  {
1458  return const_cast<iterator>( pcl::MaxItem( m_data->begin, m_data->end, p ) );
1459  }
1460 
1463  void Reverse()
1464  {
1465  EnsureUnique();
1466  pcl::Reverse( m_data->begin, m_data->end );
1467  }
1468 
1472  {
1473  if ( Length() > 1 && n != 0 )
1474  {
1475  EnsureUnique();
1476  if ( (n %= Length()) < 0 )
1477  n += Length();
1478  pcl::Rotate( m_data->begin, m_data->begin+n, m_data->end );
1479  }
1480  }
1481 
1484  void ShiftLeft( const T& v, size_type n = 1 )
1485  {
1486  if ( !IsEmpty() && n > 0 )
1487  {
1488  EnsureUnique();
1489  if ( n >= Length() )
1490  pcl::Fill( m_data->begin, m_data->end, v );
1491  else
1492  pcl::ShiftLeft( m_data->begin, m_data->begin+n, m_data->end, v );
1493  }
1494  }
1495 
1498  void ShiftRight( const T& v, size_type n = 1 )
1499  {
1500  if ( !IsEmpty() && n > 0 )
1501  {
1502  EnsureUnique();
1503  if ( n >= Length() )
1504  pcl::Fill( m_data->begin, m_data->end, v );
1505  else
1506  pcl::ShiftRight( m_data->begin, m_data->end-n, m_data->end, v );
1507  }
1508  }
1509 
1512  iterator Search( const T& v ) const noexcept
1513  {
1514  return const_cast<iterator>( pcl::LinearSearch( m_data->begin, m_data->end, v ) );
1515  }
1516 
1519  template <class BP>
1520  iterator Search( const T& v, BP p ) const noexcept( noexcept( p ) )
1521  {
1522  return const_cast<iterator>( pcl::LinearSearch( m_data->begin, m_data->end, v, p ) );
1523  }
1524 
1527  iterator SearchLast( const T& v ) const noexcept
1528  {
1529  return const_cast<iterator>( pcl::LinearSearchLast( m_data->begin, m_data->end, v ) );
1530  }
1531 
1534  template <class BP>
1535  iterator SearchLast( const T& v, BP p ) const noexcept( noexcept( p ) )
1536  {
1537  return const_cast<iterator>( pcl::LinearSearchLast( m_data->begin, m_data->end, v, p ) );
1538  }
1539 
1542  template <class FI>
1543  iterator SearchSubset( FI i, FI j ) const noexcept
1544  {
1545  return const_cast<iterator>( pcl::Search( m_data->begin, m_data->end, i, j ) );
1546  }
1547 
1550  template <class FI, class BP>
1551  iterator SearchSubset( FI i, FI j, BP p ) const noexcept( noexcept( p ) )
1552  {
1553  return const_cast<iterator>( pcl::Search( m_data->begin, m_data->end, i, j, p ) );
1554  }
1555 
1558  template <class C>
1559  iterator SearchSubset( const C& x ) const noexcept
1560  {
1561  PCL_ASSERT_DIRECT_CONTAINER( C, T );
1562  return const_cast<iterator>( pcl::Search( m_data->begin, m_data->end, x.Begin(), x.End() ) );
1563  }
1564 
1567  template <class C, class BP>
1568  iterator SearchSubset( const C& x, BP p ) const noexcept( noexcept( p ) )
1569  {
1570  PCL_ASSERT_DIRECT_CONTAINER( C, T );
1571  return const_cast<iterator>( pcl::Search( m_data->begin, m_data->end, x.Begin(), x.End(), p ) );
1572  }
1573 
1576  template <class BI>
1577  iterator SearchLastSubset( BI i, BI j ) const noexcept
1578  {
1579  return const_cast<iterator>( pcl::SearchLast( m_data->begin, m_data->end, i, j ) );
1580  }
1581 
1584  template <class BI, class BP>
1585  iterator SearchLastSubset( BI i, BI j, BP p ) const noexcept( noexcept( p ) )
1586  {
1587  return const_cast<iterator>( pcl::SearchLast( m_data->begin, m_data->end, i, j, p ) );
1588  }
1589 
1592  template <class C>
1593  iterator SearchLastSubset( const C& x ) const noexcept
1594  {
1595  PCL_ASSERT_DIRECT_CONTAINER( C, T );
1596  return const_cast<iterator>( pcl::SearchLast( m_data->begin, m_data->end, x.Begin(), x.End() ) );
1597  }
1598 
1601  template <class C, class BP>
1602  iterator SearchLastSubset( const C& x, BP p ) const noexcept( noexcept( p ) )
1603  {
1604  PCL_ASSERT_DIRECT_CONTAINER( C, T );
1605  return const_cast<iterator>( pcl::SearchLast( m_data->begin, m_data->end, x.Begin(), x.End(), p ) );
1606  }
1607 
1610  bool Contains( const T& v ) const noexcept
1611  {
1612  return Search( v ) != m_data->end;
1613  }
1614 
1617  template <class BP>
1618  bool Contains( const T& v, BP p ) const noexcept( noexcept( p ) )
1619  {
1620  return Search( v, p ) != m_data->end;
1621  }
1622 
1625  template <class FI>
1626  iterator ContainsSubset( FI i, FI j ) const noexcept
1627  {
1628  return SearchSubset( i, j ) != m_data->end;
1629  }
1630 
1633  template <class FI, class BP>
1634  iterator ContainsSubset( FI i, FI j, BP p ) const noexcept( noexcept( p ) )
1635  {
1636  return SearchSubset( i, j, p ) != m_data->end;
1637  }
1638 
1641  template <class C>
1642  iterator ContainsSubset( const C& c ) const noexcept
1643  {
1644  return SearchSubset( c ) != m_data->end;
1645  }
1646 
1649  template <class C, class BP>
1650  iterator ContainsSubset( const C& c, BP p ) const noexcept( noexcept( p ) )
1651  {
1652  return SearchSubset( c, p ) != m_data->end;
1653  }
1654 
1657  void Sort()
1658  {
1659  EnsureUnique();
1660  pcl::QuickSort( m_data->begin, m_data->end );
1661  }
1662 
1665  template <class BP>
1666  void Sort( BP p )
1667  {
1668  EnsureUnique();
1669  pcl::QuickSort( m_data->begin, m_data->end, p );
1670  }
1671 
1675  friend void Swap( Array& x1, Array& x2 ) noexcept
1676  {
1677  pcl::Swap( x1.m_data, x2.m_data );
1678  }
1679 
1696  template <class S, typename SP>
1697  S& ToSeparated( S& s, SP separator ) const
1698  {
1699  const_iterator i = m_data->begin;
1700  if ( i < m_data->end )
1701  {
1702  s.Append( S( *i ) );
1703  if ( ++i < m_data->end )
1704  do
1705  {
1706  s.Append( separator );
1707  s.Append( S( *i ) );
1708  }
1709  while ( ++i < m_data->end );
1710  }
1711  return s;
1712  }
1713 
1736  template <class S, typename SP, class AF>
1737  S& ToSeparated( S& s, SP separator, AF append ) const
1738  {
1739  const_iterator i = m_data->begin;
1740  if ( i < m_data->end )
1741  {
1742  append( s, S( *i ) );
1743  if ( ++i < m_data->end )
1744  {
1745  S p( separator );
1746  do
1747  {
1748  append( s, p );
1749  append( s, S( *i ) );
1750  }
1751  while ( ++i < m_data->end );
1752  }
1753  }
1754  return s;
1755  }
1756 
1765  template <class S>
1766  S& ToCommaSeparated( S& s ) const
1767  {
1768  return ToSeparated( s, ',' );
1769  }
1770 
1779  template <class S>
1780  S& ToSpaceSeparated( S& s ) const
1781  {
1782  return ToSeparated( s, ' ' );
1783  }
1784 
1793  template <class S>
1794  S& ToTabSeparated( S& s ) const
1795  {
1796  return ToSeparated( s, '\t' );
1797  }
1798 
1807  template <class S>
1808  S& ToNewLineSeparated( S& s ) const
1809  {
1810  return ToSeparated( s, '\n' );
1811  }
1812 
1821  uint64 Hash64( uint64 seed = 0 ) const
1822  {
1823  return pcl::Hash64( m_data->begin, m_data->Size(), seed );
1824  }
1825 
1834  uint32 Hash32( uint32 seed = 0 ) const noexcept
1835  {
1836  return pcl::Hash32( m_data->begin, m_data->Size(), seed );
1837  }
1838 
1843  uint64 Hash( uint64 seed = 0 ) const noexcept
1844  {
1845  return Hash64( seed );
1846  }
1847 
1848  // -------------------------------------------------------------------------
1849 
1850 private:
1851 
1857  struct Data : public ReferenceCounter
1858  {
1859  iterator begin = nullptr;
1860  iterator end = nullptr;
1861  iterator available = nullptr;
1862  allocator alloc;
1863 
1867  Data() = default;
1868 
1872  ~Data()
1873  {
1874  Deallocate();
1875  }
1876 
1880  size_type Size() const noexcept
1881  {
1882  return Length()*sizeof( T );
1883  }
1884 
1888  size_type Length() const noexcept
1889  {
1890  return end - begin;
1891  }
1892 
1896  size_type Capacity() const noexcept
1897  {
1898  return available - begin;
1899  }
1900 
1904  size_type Available() const noexcept
1905  {
1906  return available - end;
1907  }
1908 
1912  bool IsEmpty() const noexcept
1913  {
1914  return begin == end;
1915  }
1916 
1921  void Allocate( size_type n )
1922  {
1923  if ( n > 0 )
1924  {
1925  size_type m = alloc.PagedLength( n );
1926  begin = alloc.Allocate( m );
1927  end = begin + n;
1928  available = begin + m;
1929  }
1930  }
1931 
1935  void Deallocate()
1936  {
1937  PCL_CHECK( (begin == nullptr) ? end == nullptr : begin < end )
1938  if ( begin != nullptr )
1939  {
1940  Destroy( begin, end );
1941  alloc.Deallocate( begin );
1942  begin = end = available = nullptr;
1943  }
1944  }
1945 
1949  void Initialize( iterator __restrict__ i, iterator __restrict__ j )
1950  {
1951  for ( ; i < j; ++i )
1952  pcl::Construct( i, alloc );
1953  }
1954 
1959  void Initialize( iterator __restrict__ i, size_type n )
1960  {
1961  for ( ; n > 0; ++i, --n )
1962  pcl::Construct( i, alloc );
1963  }
1964 
1969  void Initialize( iterator __restrict__ i, iterator __restrict__ j, const T& v )
1970  {
1971  for ( ; i < j; ++i )
1972  pcl::Construct( i, v, alloc );
1973  }
1974 
1979  void Initialize( iterator __restrict__ i, size_type n, const T& v )
1980  {
1981  for ( ; n > 0; ++i, --n )
1982  pcl::Construct( i, v, alloc );
1983  }
1984 
1990  template <class FI>
1991  iterator Build( iterator __restrict__ i, FI p, FI q )
1992  {
1993  for ( ; p != q; ++i, ++p )
1994  pcl::Construct( i, *p, alloc );
1995  return i;
1996  }
1997 
2003  iterator UninitializedGrow( iterator __restrict__ i, size_type n )
2004  {
2005  if ( n > 0 )
2006  if ( Available() >= n )
2007  {
2008  if ( i < end )
2009  {
2010  iterator __restrict__ j1 = end;
2011  iterator __restrict__ j2 = end + n;
2012 
2013  for ( ;; )
2014  {
2015  pcl::Construct( --j2, *--j1, alloc );
2016 
2017  if ( j1 == i )
2018  {
2019  j2 = end;
2020  break;
2021  }
2022  else if ( j2 == end )
2023  {
2024  do
2025  *--j2 = *--j1;
2026  while ( j1 > i );
2027  break;
2028  }
2029  }
2030 
2031  Destroy( i, j2 );
2032  }
2033  end += n;
2034  }
2035  else
2036  {
2037  size_type m = alloc.PagedLength( Length()+n );
2038  iterator b = alloc.Allocate( m );
2039  iterator r = Build( b, begin, i );
2040  iterator e = Build( r+n, i, end );
2041 
2042  Deallocate();
2043  begin = b;
2044  end = e;
2045  available = b + m;
2046  i = r;
2047  }
2048 
2049  return i;
2050  }
2051 
2055  static void Destroy( iterator i, iterator j )
2056  {
2057  pcl::Destroy( i, j );
2058  }
2059  };
2060 
2065  Data* m_data = nullptr;
2066 
2071  void DetachFromData()
2072  {
2073  if ( !m_data->Detach() )
2074  delete m_data;
2075  }
2076 };
2077 
2078 // ----------------------------------------------------------------------------
2079 
2089 template <class T, class A> inline
2090 bool operator ==( const Array<T,A>& x1, const Array<T,A>& x2 ) noexcept
2091 {
2092  return x1.Length() == x2.Length() && pcl::Equal( x1.Begin(), x2.Begin(), x2.End() );
2093 }
2094 
2100 template <class T, class A> inline
2101 bool operator <( const Array<T,A>& x1, const Array<T,A>& x2 ) noexcept
2102 {
2103  return pcl::Compare( x1.Begin(), x1.End(), x2.Begin(), x2.End() ) < 0;
2104 }
2105 
2117 template <class T, class A, class V> inline
2119 {
2120  x.Append( T( v ) );
2121  return x;
2122 }
2123 
2131 template <class T, class A, class V> inline
2132 Array<T,A>& operator <<( Array<T,A>&& x, const V& v )
2133 {
2134  x.Append( T( v ) );
2135  return x;
2136 }
2137 
2143 template <class T, class A> inline
2145 {
2146  x1.Append( x2 );
2147  return x1;
2148 }
2149 
2155 template <class T, class A> inline
2157 {
2158  x1.Append( x2 );
2159  return x1;
2160 }
2161 
2162 // ----------------------------------------------------------------------------
2163 
2164 } // pcl
2165 
2166 #endif // __PCL_Array_h
2167 
2168 // ----------------------------------------------------------------------------
2169 // EOF pcl/Array.h - Released 2024-01-13T15:47:58Z
pcl::Array::SecureFill
void SecureFill(const T &v)
Definition: Array.h:1360
pcl::Array::ReverseBegin
const_reverse_iterator ReverseBegin() const noexcept
Definition: Array.h:492
pcl::Array::ReverseBegin
reverse_iterator ReverseBegin()
Definition: Array.h:479
pcl::LinearSearchLast
BI LinearSearchLast(BI i, BI j, const T &v) noexcept
Definition: Search.h:129
pcl::Array::Add
void Add(FI p, FI q)
Definition: Array.h:1024
pcl::Array::Array
Array()
Definition: Array.h:132
pcl::Array::Length
size_type Length() const noexcept
Definition: Array.h:266
pcl
PCL root namespace.
Definition: AbstractImage.h:76
pcl::Distance
distance_type Distance(FI i, FI j)
Definition: Iterator.h:161
pcl::Array::Assign
void Assign(FI i, FI j)
Definition: Array.h:733
pcl::Array::Truncate
void Truncate(iterator i)
Definition: Array.h:1080
pcl::Range
constexpr const T & Range(const T &x, const T &a, const T &b) noexcept
Definition: Utility.h:190
pcl::Array::MinItem
iterator MinItem() const noexcept
Definition: Array.h:1433
Container.h
pcl::Array::Size
size_type Size() const noexcept
Definition: Array.h:258
pcl::Array::UniquifyIterator
void UniquifyIterator(iterator &i)
Definition: Array.h:558
pcl::LastThat
BI LastThat(BI i, BI j, UP p) noexcept(noexcept(p))
Definition: Utility.h:350
Allocator.h
pcl::Array::ContainsSubset
iterator ContainsSubset(const C &c) const noexcept
Definition: Array.h:1642
ReferenceCounter.h
pcl::Array::Capacity
size_type Capacity() const noexcept
Definition: Array.h:275
Utility.h
pcl::Max
constexpr const T & Max(const T &a, const T &b) noexcept
Definition: Utility.h:119
pcl::CountIf
size_type CountIf(FI i, FI j, UP p) noexcept(noexcept(p))
Definition: Utility.h:423
pcl::QuickSort
void QuickSort(RI i, RI j)
Definition: Sort.h:236
pcl::operator==
bool operator==(const Array< T, A > &x1, const Array< T, A > &x2) noexcept
Definition: Array.h:2090
Relational.h
pcl::Hash64
uint64 Hash64(const void *data, size_type size, uint64 seed=0) noexcept
Definition: Math.h:4750
pcl::Array::CountIf
size_type CountIf(UP p) const noexcept(noexcept(p))
Definition: Array.h:1426
pcl::Array::Assign
void Assign(const T &v, size_type n=1)
Definition: Array.h:698
pcl::Array::End
iterator End()
Definition: Array.h:451
pcl::Array::IsValid
bool IsValid() const noexcept
Definition: Array.h:304
pcl::Array::Contains
bool Contains(const T &v, BP p) const noexcept(noexcept(p))
Definition: Array.h:1618
pcl::Array::SearchLastSubset
iterator SearchLastSubset(BI i, BI j) const noexcept
Definition: Array.h:1577
pcl::Array::UpperBound
size_type UpperBound() const noexcept
Definition: Array.h:330
pcl::Array::Add
void Add(const T &v, size_type n=1)
Definition: Array.h:1015
pcl::Array::MutableIterator
iterator MutableIterator(const_iterator i)
Definition: Array.h:381
pcl::Array::Resize
void Resize(size_type n)
Definition: Array.h:870
pcl::Array::Reverse
void Reverse()
Definition: Array.h:1463
pcl::Array::ContainsSubset
iterator ContainsSubset(const C &c, BP p) const noexcept(noexcept(p))
Definition: Array.h:1650
pcl::Array::Array
Array(size_type n, const T &v)
Definition: Array.h:151
pcl::Array::Replace
iterator Replace(iterator i, iterator j, const Array &x)
Definition: Array.h:1179
pcl::Array::SetAllocator
void SetAllocator(const allocator &a)
Definition: Array.h:346
pcl::uint32
unsigned int uint32
Definition: Defs.h:669
pcl::Array::Release
iterator Release()
Definition: Array.h:798
pcl::Array::Hash32
uint32 Hash32(uint32 seed=0) const noexcept
Definition: Array.h:1834
pcl::Array::Allocator
const allocator & Allocator() const noexcept
Definition: Array.h:338
pcl::MinItem
FI MinItem(FI i, FI j) noexcept
Definition: Utility.h:441
pcl::Array::SearchSubset
iterator SearchSubset(const C &x, BP p) const noexcept(noexcept(p))
Definition: Array.h:1568
pcl::Array::Insert
iterator Insert(iterator i, const T &v, size_type n=1)
Definition: Array.h:909
pcl::Array::~Array
~Array()
Definition: Array.h:208
pcl::Array::SearchLastSubset
iterator SearchLastSubset(const C &x) const noexcept
Definition: Array.h:1593
pcl::Array::MinItem
iterator MinItem(BP p) const noexcept(noexcept(p))
Definition: Array.h:1441
pcl::Array::SearchLast
iterator SearchLast(const T &v) const noexcept
Definition: Array.h:1527
pcl::Array::Transfer
void Transfer(Array &&x)
Definition: Array.h:687
pcl::Array::Append
void Append(const Array &x)
Definition: Array.h:948
pcl::Array::MaxItem
iterator MaxItem() const noexcept
Definition: Array.h:1448
pcl::Array::Insert
iterator Insert(iterator i, FI p, FI q)
Definition: Array.h:933
Indirect.h
pcl::Array::begin
const_iterator begin() const noexcept
Definition: Array.h:603
pcl::Search
FI1 Search(FI1 i1, FI1 j1, FI2 i2, FI2 j2) noexcept
Definition: Search.h:397
pcl::Array::FirstThat
iterator FirstThat(F f) const noexcept(noexcept(f))
Definition: Array.h:1392
pcl::Array::IsUnique
bool IsUnique() const noexcept
Definition: Array.h:220
pcl::Apply
void Apply(FI i, FI j, F f) noexcept(noexcept(f))
Definition: Utility.h:249
pcl::Array::Prepend
void Prepend(FI p, FI q)
Definition: Array.h:999
pcl::Compare
int Compare(FI1 i1, FI1 j1, FI2 i2, FI2 j2) noexcept
Definition: Utility.h:639
pcl::Array::ShiftRight
void ShiftRight(const T &v, size_type n=1)
Definition: Array.h:1498
pcl::Array::Apply
void Apply(F f)
Definition: Array.h:1370
pcl::operator<<
Array< T, A > & operator<<(Array< T, A > &x, const V &v)
Definition: Array.h:2118
pcl::Array::Contains
bool Contains(const T &v) const noexcept
Definition: Array.h:1610
pcl::Array::EnsureUnique
void EnsureUnique()
Definition: Array.h:242
pcl::Array::ContainsSubset
iterator ContainsSubset(FI i, FI j, BP p) const noexcept(noexcept(p))
Definition: Array.h:1634
pcl::Array::At
iterator At(size_type i)
Definition: Array.h:355
pcl::size_type
size_t size_type
Definition: Defs.h:612
Math.h
pcl::Array::ContainsSubset
iterator ContainsSubset(FI i, FI j) const noexcept
Definition: Array.h:1626
pcl::Array::Replace
iterator Replace(iterator i, iterator j, FI p, FI q)
Definition: Array.h:1244
pcl::Array::Add
void Add(const Array &x)
Definition: Array.h:1007
pcl::Array::Remove
void Remove(const T &v, BP p)
Definition: Array.h:1118
pcl::uint64
unsigned long long uint64
Definition: Defs.h:685
pcl::Array
Generic dynamic array.
Definition: Array.h:99
pcl::Array::Begin
const_iterator Begin() const noexcept
Definition: Array.h:435
pcl::distance_type
ptrdiff_t distance_type
Definition: Defs.h:618
pcl::Array::ConstBegin
const_iterator ConstBegin() const noexcept
Definition: Array.h:443
pcl::Array::Array
Array(const Array &x)
Definition: Array.h:188
pcl::Array::Hash64
uint64 Hash64(uint64 seed=0) const
Definition: Array.h:1821
pcl::Array::Sort
void Sort(BP p)
Definition: Array.h:1666
pcl::Array::Expand
iterator Expand(size_type n=1)
Definition: Array.h:836
pcl::Array::Swap
friend void Swap(Array &x1, Array &x2) noexcept
Definition: Array.h:1675
pcl::Array::SearchLastSubset
iterator SearchLastSubset(BI i, BI j, BP p) const noexcept(noexcept(p))
Definition: Array.h:1585
pcl::FirstThat
FI FirstThat(FI i, FI j, UP p) noexcept(noexcept(p))
Definition: Utility.h:316
pcl::Array::SearchLast
iterator SearchLast(const T &v, BP p) const noexcept(noexcept(p))
Definition: Array.h:1535
pcl::Destroy
void Destroy(T *p)
Definition: Allocator.h:277
pcl::Construct
void Construct(T *p, A &a)
Definition: Allocator.h:247
pcl::Array::UniquifyIterators
void UniquifyIterators(iterator &i, iterator &j)
Definition: Array.h:578
pcl::Array::Clear
void Clear()
Definition: Array.h:1153
pcl::Array::Squeeze
void Squeeze()
Definition: Array.h:1313
pcl::Array::ReverseEnd
reverse_iterator ReverseEnd()
Definition: Array.h:517
pcl::LinearSearch
FI LinearSearch(FI i, FI j, const T &v) noexcept
Definition: Search.h:91
pcl::MaxItem
FI MaxItem(FI i, FI j) noexcept
Definition: Utility.h:479
pcl::Array::Count
size_type Count(const T &v) const noexcept
Definition: Array.h:1410
pcl::Array::end
const_iterator end() const noexcept
Definition: Array.h:619
pcl::StandardAllocator
A block allocator class that uses the standard new and delete operators.
Definition: StandardAllocator.h:81
pcl::Array::Append
void Append(FI p, FI q)
Definition: Array.h:969
pcl::Array::Rotate
void Rotate(distance_type n)
Definition: Array.h:1471
pcl::Hash32
uint32 Hash32(const void *data, size_type size, uint32 seed=0) noexcept
Definition: Math.h:4904
Iterator.h
pcl::ReferenceCounter
Thread-safe reference counter for copy-on-write data structures.
Definition: ReferenceCounter.h:99
pcl::Array::ConstReverseBegin
const_reverse_iterator ConstReverseBegin() const noexcept
Definition: Array.h:504
pcl::Array::Available
size_type Available() const noexcept
Definition: Array.h:286
pcl::Array::Hash
uint64 Hash(uint64 seed=0) const noexcept
Definition: Array.h:1843
pcl::Array::At
const_iterator At(size_type i) const noexcept
Definition: Array.h:365
pcl::DirectContainer
Root base class of all PCL containers of objects.
Definition: Container.h:77
pcl::Array::End
const_iterator End() const noexcept
Definition: Array.h:460
pcl::Array::IsAliasOf
bool IsAliasOf(const Array &x) const noexcept
Definition: Array.h:230
pcl::Array::Prepend
void Prepend(const Array &x)
Definition: Array.h:978
pcl::Swap
void Swap(GenericPoint< T > &p1, GenericPoint< T > &p2) noexcept
Definition: Point.h:1459
pcl::Array::Remove
void Remove(const T &v)
Definition: Array.h:1089
pcl::Array::end
iterator end()
Definition: Array.h:611
pcl::Array::Transfer
void Transfer(Array &x)
Definition: Array.h:671
pcl::Min
constexpr const T & Min(const T &a, const T &b) noexcept
Definition: Utility.h:90
pcl::Array::Replace
iterator Replace(iterator i, iterator j, const T &v, size_type n=1)
Definition: Array.h:1201
pcl::Array::Sort
void Sort()
Definition: Array.h:1657
pcl::Array::Count
size_type Count(const T &v, BP p) const noexcept(noexcept(p))
Definition: Array.h:1418
pcl::Array::begin
iterator begin()
Definition: Array.h:595
pcl::Array::Assign
void Assign(const Array &x)
Definition: Array.h:646
StandardAllocator.h
pcl::Array::Append
void Append(const T &v, size_type n=1)
Definition: Array.h:957
pcl::operator*
Complex< T1 > operator*(const Complex< T1 > &c1, const Complex< T2 > &c2) noexcept
Definition: Complex.h:548
pcl::Array::Apply
void Apply(F f) const noexcept(noexcept(f))
Definition: Array.h:1381
Search.h
pcl::Array::ReverseEnd
const_reverse_iterator ReverseEnd() const noexcept
Definition: Array.h:531
pcl::Array::Grow
iterator Grow(iterator i, size_type n=1)
Definition: Array.h:816
pcl::Array::Search
iterator Search(const T &v) const noexcept
Definition: Array.h:1512
Sort.h
pcl::Array::Import
void Import(iterator i, iterator j)
Definition: Array.h:771
pcl::Array::ConstReverseEnd
const_reverse_iterator ConstReverseEnd() const noexcept
Definition: Array.h:544
pcl::Array::ShiftLeft
void ShiftLeft(const T &v, size_type n=1)
Definition: Array.h:1484
pcl::Array::Remove
void Remove(iterator i, iterator j)
Definition: Array.h:1052
pcl::Array::Array
Array(FI i, FI j)
Definition: Array.h:163
pcl::Array::SearchSubset
iterator SearchSubset(const C &x) const noexcept
Definition: Array.h:1559
pcl::Array::Search
iterator Search(const T &v, BP p) const noexcept(noexcept(p))
Definition: Array.h:1520
pcl::Array::Insert
iterator Insert(iterator i, const Array &x)
Definition: Array.h:890
pcl::Array::Array
Array(Array &&x)
Definition: Array.h:198
pcl::Count
size_type Count(FI i, FI j, const T &v) noexcept
Definition: Utility.h:384
pcl::Array::IsEmpty
bool IsEmpty() const noexcept
Definition: Array.h:312
pcl::Array::Remove
void Remove(iterator i, size_type n=1)
Definition: Array.h:1038
pcl::Array::LowerBound
size_type LowerBound() const noexcept
Definition: Array.h:321
pcl::Array::Array
Array(size_type n)
Definition: Array.h:141
pcl::SearchLast
BI1 SearchLast(BI1 i1, BI1 j1, FI2 i2, FI2 j2) noexcept
Definition: Search.h:449
pcl::Array::LastThat
iterator LastThat(F f) const noexcept(noexcept(f))
Definition: Array.h:1403
Defs.h
pcl::Equal
bool Equal(FI1 i1, FI2 i2, FI2 j2) noexcept
Definition: Utility.h:592
pcl::Allocator
Provides memory allocation for PCL containers.
Definition: Allocator.h:131
pcl::Array::Array
Array(std::initializer_list< T1 > l)
Definition: Array.h:180
pcl::Array::MaxItem
iterator MaxItem(BP p) const noexcept(noexcept(p))
Definition: Array.h:1456
pcl::Array::ConstEnd
const_iterator ConstEnd() const noexcept
Definition: Array.h:468
pcl::Array::Prepend
void Prepend(const T &v, size_type n=1)
Definition: Array.h:987
pcl::Array::Fill
void Fill(const T &v)
Definition: Array.h:1342
pcl::GaiaStarData
Star data structure for Gaia catalog search operations.
Definition: GaiaDatabaseFile.h:206
pcl::Array::SearchSubset
iterator SearchSubset(FI i, FI j, BP p) const noexcept(noexcept(p))
Definition: Array.h:1551
pcl::Array::SearchLastSubset
iterator SearchLastSubset(const C &x, BP p) const noexcept(noexcept(p))
Definition: Array.h:1602
pcl::Array::Begin
iterator Begin()
Definition: Array.h:426
pcl::Array::Shrink
void Shrink(size_type n=1)
Definition: Array.h:850
pcl::ReverseRandomAccessIterator
Reverse random access iterator.
Definition: Iterator.h:419
pcl::Array::SearchSubset
iterator SearchSubset(FI i, FI j) const noexcept
Definition: Array.h:1543
pcl::operator<
bool operator<(const Array< T, A > &x1, const Array< T, A > &x2) noexcept
Definition: Array.h:2101
pcl::Rotate
void Rotate(T &x, T &y, T1 sa, T1 ca, T2 xc, T2 yc) noexcept
Definition: Math.h:2024
pcl::Array::Reserve
void Reserve(size_type n)
Definition: Array.h:1275