PCL
ReferenceArray.h
Go to the documentation of this file.
1 // ____ ______ __
2 // / __ \ / ____// /
3 // / /_/ // / / /
4 // / ____// /___ / /___ PixInsight Class Library
5 // /_/ \____//_____/ PCL 2.6.11
6 // ----------------------------------------------------------------------------
7 // pcl/ReferenceArray.h - Released 2024-05-07T15:27: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-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_ReferenceArray_h
53 #define __PCL_ReferenceArray_h
54 
56 
57 #include <pcl/Diagnostics.h>
58 
59 #include <pcl/Allocator.h>
60 #include <pcl/Container.h>
61 #include <pcl/IndirectArray.h>
62 #include <pcl/Iterator.h>
63 #include <pcl/StandardAllocator.h>
64 
65 namespace pcl
66 {
67 
68 // ----------------------------------------------------------------------------
69 
94 template <typename T, class A = StandardAllocator>
95 class PCL_CLASS ReferenceArray : public DirectContainer<T>
96 {
97 public:
98 
102 
106 
110 
114 
118 
123  class iterator : public Iterator<RandomAccessIterator, T>
124  {
125  public:
126 
128  using iterator_class = typename iterator_base::iterator_class;
129  using item_type = typename iterator_base::item_type;
130 
134  iterator() = default;
135 
139  iterator( const iterator& ) = default;
140 
144  iterator( std::nullptr_t ) : it( nullptr )
145  {
146  }
147 
151  iterator& operator =( const iterator& ) = default;
152 
156  T* Pointer() const
157  {
158  return *it;
159  }
160 
165  operator T*() const
166  {
167  return *it;
168  }
169 
174  T& operator *() const
175  {
176  return **it;
177  }
178 
183  T* operator ->() const
184  {
185  return *it;
186  }
187 
193  iterator& operator ++()
194  {
195  ++it;
196  return *this;
197  }
198 
204  iterator operator ++( int )
205  {
206  indirect_iterator it0 = it;
207  ++it;
208  return it0;
209  }
210 
216  iterator& operator --()
217  {
218  --it;
219  return *this;
220  }
221 
227  iterator operator --( int )
228  {
229  indirect_iterator it0 = it;
230  --it;
231  return it0;
232  }
233 
241  iterator& operator +=( distance_type d )
242  {
243  it += d;
244  return *this;
245  }
246 
254  iterator& operator -=( distance_type d )
255  {
256  it -= d;
257  return *this;
258  }
259 
265  {
266  return iterator( it + d );
267  }
268 
274  {
275  return iterator( it - d );
276  }
277 
283  {
284  return it - i.it;
285  }
286 
291  bool operator ==( const iterator& i ) const
292  {
293  return it == i.it;
294  }
295 
300  bool operator <( const iterator& i ) const
301  {
302  return it < i.it;
303  }
304 
305  private:
306 
307  indirect_iterator it = nullptr;
308 
313  explicit
314  iterator( indirect_iterator i ) : it( i )
315  {
316  }
317 
318  friend class ReferenceArray<T,A>;
319  friend class ReferenceArray<T,A>::const_iterator;
320  };
321 
326  class const_iterator : public Iterator<RandomAccessIterator, T>
327  {
328  public:
329 
331  using iterator_class = typename iterator_base::iterator_class;
332  using item_type = typename iterator_base::item_type;
333 
337  const_iterator() = default;
338 
342  const_iterator( const iterator& i ) : it( i.it )
343  {
344  }
345 
349  const_iterator( std::nullptr_t ) : it( nullptr )
350  {
351  }
352 
356  const_iterator( const const_iterator& ) = default;
357 
362  const_iterator& operator =( const const_iterator& ) = default;
363 
368  const_iterator& operator =( const iterator& i )
369  {
370  it = i.it;
371  return *this;
372  }
373 
377  const T* Pointer() const
378  {
379  return *it;
380  }
381 
386  operator const T*() const
387  {
388  return *it;
389  }
390 
395  const T& operator *() const
396  {
397  return **it;
398  }
399 
404  const T* operator ->() const
405  {
406  return *it;
407  }
408 
414  const_iterator& operator ++()
415  {
416  ++it;
417  return *this;
418  }
419 
425  const_iterator operator ++( int )
426  {
427  const_indirect_iterator it0 = it;
428  ++it;
429  return it0;
430  }
431 
437  const_iterator& operator --()
438  {
439  --it;
440  return *this;
441  }
442 
448  const_iterator operator --( int )
449  {
450  const_indirect_iterator it0 = it;
451  --it;
452  return it0;
453  }
454 
462  const_iterator& operator +=( distance_type d )
463  {
464  it += d;
465  return *this;
466  }
467 
475  const_iterator& operator -=( distance_type d )
476  {
477  it -= d;
478  return *this;
479  }
480 
486  {
487  return const_iterator( it + d );
488  }
489 
495  {
496  return const_iterator( it - d );
497  }
498 
504  {
505  return it - i.it;
506  }
507 
513  {
514  return it - i.it;
515  }
516 
521  bool operator ==( const const_iterator& i ) const
522  {
523  return it == i.it;
524  }
525 
530  bool operator ==( const iterator& i ) const
531  {
532  return it == i.it;
533  }
534 
539  bool operator <( const const_iterator& i ) const
540  {
541  return it < i.it;
542  }
543 
548  bool operator <( const iterator& i ) const
549  {
550  return it < i.it;
551  }
552 
553  private:
554 
555  const_indirect_iterator it = nullptr;
556 
561  explicit
563  {
564  }
565 
566  friend class ReferenceArray<T,A>;
567  };
568 
573  using reverse_iterator = ReverseRandomAccessIterator<iterator, T>;
574 
579  using const_reverse_iterator = ReverseRandomAccessIterator<const_iterator, const T>;
580 
581  // -------------------------------------------------------------------------
582 
586  ReferenceArray() = default;
587 
594  ReferenceArray( size_type n, const T* p )
595  {
596  PCL_PRECONDITION( p != nullptr )
597  if ( p != nullptr )
598  m_array = array_implementation( n, p );
599  }
600 
608  template <class FI>
609  ReferenceArray( FI i, FI j )
610  {
611  for ( ; i != j; ++i )
612  if ( *i != nullptr )
613  m_array.Append( *i );
614  }
615 
619  ReferenceArray( const ReferenceArray& ) = default;
620 
625 
634  {
635  }
636 
641  bool IsUnique() const
642  {
643  return m_array.IsUnique();
644  }
645 
652  bool IsAliasOf( const ReferenceArray& x ) const
653  {
654  return m_array.IsAliasOf( x.m_array );
655  }
656 
666  {
667  m_array.EnsureUnique();
668  }
669 
674  size_type Size() const
675  {
676  return m_array.Size();
677  }
678 
683  {
684  return m_array.Length();
685  }
686 
693  {
694  return m_array.Capacity();
695  }
696 
705  {
706  return m_array.Available();
707  }
708 
724  bool IsValid() const
725  {
726  return m_array.IsValid();
727  }
728 
732  bool IsEmpty() const
733  {
734  return m_array.IsEmpty();
735  }
736 
742  {
743  return m_array.LowerBound();
744  }
745 
751  {
752  return m_array.UpperBound();
753  }
754 
758  const allocator& Allocator() const
759  {
760  return m_array.Allocator();
761  }
762 
766  void SetAllocator( const allocator& a )
767  {
768  m_array.SetAllocator( a );
769  }
770 
776  {
777  return iterator( m_array.At( i ) );
778  }
779 
785  {
786  return const_iterator( m_array.At( i ) );
787  }
788 
800  {
801  return iterator( m_array.MutableIterator( i.it ) );
802  }
803 
808  T& operator []( size_type i )
809  {
810  return *m_array[i];
811  }
812 
817  const T& operator []( size_type i ) const
818  {
819  return *m_array[i];
820  }
821 
826  {
827  return **m_array.Begin();
828  }
829 
834  const T& operator *() const
835  {
836  return **m_array.Begin();
837  }
838 
843  {
844  return iterator( m_array.Begin() );
845  }
846 
851  {
852  return const_iterator( m_array.Begin() );
853  }
854 
859  {
860  return const_iterator( m_array.ConstBegin() );
861  }
862 
867  {
868  return iterator( m_array.End() );
869  }
870 
875  {
876  return const_iterator( m_array.End() );
877  }
878 
883  {
884  return const_iterator( m_array.ConstEnd() );
885  }
886 
894  {
895  return iterator( m_array.End()-1 );
896  }
897 
905  {
906  return const_iterator( m_array.End()-1 );
907  }
908 
916  {
917  PCL_PRECONDITION( !IsEmpty() )
918  return const_iterator( m_array.End()-1 );
919  }
920 
929  {
930  PCL_PRECONDITION( !IsEmpty() )
931  return iterator( m_array.Begin()-1 );
932  }
933 
942  {
943  PCL_PRECONDITION( !IsEmpty() )
944  return const_iterator( m_array.Begin()-1 );
945  }
946 
955  {
956  PCL_PRECONDITION( !IsEmpty() )
957  return const_iterator( m_array.Begin()-1 );
958  }
959 
964  T& First()
965  {
966  return **m_array.Begin();
967  }
968 
973  const T& First() const
974  {
975  return **m_array.Begin();
976  }
977 
982  T& Last()
983  {
984  return **m_array.ReverseBegin();
985  }
986 
991  const T& Last() const
992  {
993  return **m_array.ReverseBegin();
994  }
995 
1006  {
1007  m_array.UniquifyIterator( i.it );
1008  }
1009 
1021  {
1022  m_array.UniquifyIterators( i.it, j.it );
1023  }
1024 
1025 #ifndef __PCL_NO_STL_COMPATIBLE_ITERATORS
1030  {
1031  return Begin();
1032  }
1033 
1038  {
1039  return Begin();
1040  }
1041 
1046  {
1047  return End();
1048  }
1049 
1054  {
1055  return End();
1056  }
1057 #endif // !__PCL_NO_STL_COMPATIBLE_ITERATORS
1058 
1065  ReferenceArray& operator =( const ReferenceArray& x )
1066  {
1067  Assign( x );
1068  return *this;
1069  }
1070 
1080  void Assign( const ReferenceArray& x )
1081  {
1082  m_array.Assign( x.m_array );
1083  }
1084 
1088  ReferenceArray& operator =( ReferenceArray&& x )
1089  {
1090  Transfer( x );
1091  return *this;
1092  }
1093 
1104  {
1105  m_array.Transfer( x.m_array );
1106  }
1107 
1118  {
1119  m_array.Transfer( std::move( x.m_array ) );
1120  }
1121 
1128  void Assign( const T* p, size_type n = 1 )
1129  {
1130  if ( p != nullptr )
1131  m_array.Assign( p, n );
1132  else
1133  m_array.Clear();
1134  }
1135 
1145  template <class FI>
1146  void Assign( FI i, FI j )
1147  {
1148  m_array.Clear();
1149  for ( ; i != j; ++i )
1150  if ( *i != nullptr )
1151  m_array.Append( *i );
1152  }
1153 
1164  template <class C>
1165  void CloneAssign( const C& x )
1166  {
1167  PCL_ASSERT_CONTAINER( C, T );
1168  CloneObjects( x, (C*)nullptr );
1169  }
1170 
1176  void Import( iterator i, iterator j )
1177  {
1178  m_array.Import( i.it, j.it );
1179  }
1180 
1193  {
1194  return m_array.Release();
1195  }
1196 
1209  {
1210  return iterator( m_array.Insert( i.it, x.m_array ) );
1211  }
1212 
1224  iterator Insert( const_iterator i, const T* p, size_type n = 1 )
1225  {
1226  return (p != nullptr) ? iterator( m_array.Insert( i.it, p, n ) ) :
1227  iterator( const_cast<indirect_iterator>( i.it ) );
1228  }
1229 
1244  template <class FI>
1245  iterator Insert( const_iterator i, FI p, FI q )
1246  {
1247  const_indirect_iterator it = i.it;
1248  for ( ; p != q; ++p )
1249  if ( *p != nullptr )
1250  it = m_array.Insert( it, *p );
1251  return iterator( const_cast<indirect_iterator>( it ) );
1252  }
1253 
1258  void Append( const ReferenceArray& x )
1259  {
1260  m_array.Append( x.m_array );
1261  }
1262 
1269  void Append( const T* p, size_type n = 1 )
1270  {
1271  if ( p != nullptr )
1272  m_array.Append( p, n );
1273  }
1274 
1284  template <class FI>
1285  void Append( FI p, FI q )
1286  {
1287  for ( ; p != q; ++p )
1288  if ( *p != nullptr )
1289  m_array.Append( *p );
1290  }
1291 
1296  void Prepend( const ReferenceArray& x )
1297  {
1298  m_array.Prepend( x.m_array );
1299  }
1300 
1307  void Prepend( const T* p, size_type n = 1 )
1308  {
1309  if ( p != nullptr )
1310  m_array.Prepend( p, n );
1311  }
1312 
1322  template <class FI>
1323  void Prepend( FI p, FI q )
1324  {
1325  for ( ; p != q; ++p )
1326  if ( *p != nullptr )
1327  m_array.Prepend( *p );
1328  }
1329 
1333  void Add( const ReferenceArray& x )
1334  {
1335  Append( x );
1336  }
1337 
1341  void Add( const T* p, size_type n = 1 )
1342  {
1343  Append( p, n );
1344  }
1345 
1349  template <class FI>
1350  void Add( FI i, FI j )
1351  {
1352  Append( i, j );
1353  }
1354 
1363  {
1364  m_array.Remove( i.it, n );
1365  }
1366 
1375  {
1376  m_array.Remove( i.it, j.it );
1377  }
1378 
1393  {
1394  m_array.Truncate( i.it );
1395  }
1396 
1409  void Shrink( size_type n = 1 )
1410  {
1411  m_array.Shrink( n );
1412  }
1413 
1421  void Remove( const T& v )
1422  {
1423  m_array.Remove( v );
1424  }
1425 
1433  template <class BP>
1434  void Remove( const T& v, BP p )
1435  {
1436  m_array.Remove( v, p );
1437  }
1438 
1445  void RemovePointer( const T* p )
1446  {
1447  m_array.Remove( p );
1448  }
1449 
1464  void Clear()
1465  {
1466  m_array.Clear();
1467  }
1468 
1480  void Destroy( iterator i, size_type n = 1 )
1481  {
1482  m_array.Destroy( i.it, n );
1483  }
1484 
1504  {
1505  m_array.Destroy( i.it, j.it );
1506  }
1507 
1518  void Destroy( const T& v )
1519  {
1520  m_array.Destroy( v );
1521  }
1522 
1534  template <class BP>
1535  void Destroy( const T& v, BP p )
1536  {
1537  m_array.Destroy( v, p );
1538  }
1539 
1547  void Destroy()
1548  {
1549  m_array.Destroy();
1550  }
1551 
1566  {
1567  return iterator( m_array.Replace( i.it, j.it, x.m_array ) );
1568  }
1569 
1579  {
1580  return iterator( m_array.Replace( i.it, j.it, p, (p != nullptr) ? n : size_type( 0 ) ) );
1581  }
1582 
1600  template <class FI>
1602  {
1604  for ( ; p != q; ++p )
1605  if ( *p != nullptr )
1606  m.Append( *p );
1607  return iterator( m_array.Replace( i.it, j.it, m ) );
1608  }
1609 
1617  void Reserve( size_type n )
1618  {
1619  m_array.Reserve( n );
1620  }
1621 
1634  void Squeeze()
1635  {
1636  m_array.Squeeze();
1637  }
1638 
1642  void Fill( const T& v )
1643  {
1644  pcl::Fill( Begin(), End(), v );
1645  }
1646 
1651  template <class F>
1652  void Apply( F f )
1653  {
1654  pcl::Apply( Begin(), End(), f );
1655  }
1656 
1661  template <class F>
1662  void Apply( F f ) const
1663  {
1664  pcl::Apply( Begin(), End(), f );
1665  }
1666 
1672  template <class F>
1673  iterator FirstThat( F f ) const
1674  {
1675  return iterator( const_cast<indirect_iterator>( pcl::FirstThat( Begin(), End(), f ).it ) );
1676  }
1677 
1683  template <class F>
1684  iterator LastThat( F f ) const
1685  {
1686  return iterator( const_cast<indirect_iterator>( pcl::LastThat( Begin(), End(), f ).it ) );
1687  }
1688 
1692  size_type Count( const T& v ) const
1693  {
1694  return pcl::Count( Begin(), End(), v );
1695  }
1696 
1704  size_type Count( const T* p ) const
1705  {
1706  return m_array.Count( p );
1707  }
1708 
1713  template <class BP>
1714  size_type Count( const T& v, BP p ) const
1715  {
1716  return pcl::Count( Begin(), End(), v, p );
1717  }
1718 
1723  template <class UP>
1724  size_type CountIf( UP p ) const
1725  {
1726  return pcl::CountIf( Begin(), End(), p );
1727  }
1728 
1732  {
1733  return iterator( const_cast<indirect_iterator>( pcl::MinItem( Begin(), End() ).it ) );
1734  }
1735 
1738  template <class BP>
1739  iterator MinItem( BP p ) const
1740  {
1741  return iterator( const_cast<indirect_iterator>( pcl::MinItem( Begin(), End(), p ).it ) );
1742  }
1743 
1747  {
1748  return iterator( const_cast<indirect_iterator>( pcl::MaxItem( Begin(), End() ).it ) );
1749  }
1750 
1753  template <class BP>
1754  iterator MaxItem( BP p ) const
1755  {
1756  return iterator( const_cast<indirect_iterator>( pcl::MaxItem( Begin(), End(), p ).it ) );
1757  }
1758 
1761  void Reverse()
1762  {
1763  m_array.Reverse();
1764  }
1765 
1769  {
1770  m_array.Rotate( n );
1771  }
1772 
1775  void ShiftLeft( const T* p, size_type n = 1 )
1776  {
1777  m_array.ShiftLeft( p, n );
1778  }
1779 
1782  void ShiftRight( const T* p, size_type n = 1 )
1783  {
1784  m_array.ShiftRight( p, n );
1785  }
1786 
1789  iterator Search( const T& v ) const
1790  {
1791  return iterator( const_cast<indirect_iterator>( pcl::LinearSearch( Begin(), End(), v ).it ) );
1792  }
1793 
1796  iterator Search( const T* p ) const
1797  {
1798  return iterator( m_array.Search( p ) );
1799  }
1800 
1803  template <class BP>
1804  iterator Search( const T& v, BP p ) const
1805  {
1806  return iterator( const_cast<indirect_iterator>( pcl::LinearSearch( Begin(), End(), v, p ).it ) );
1807  }
1808 
1811  iterator SearchLast( const T& v ) const
1812  {
1813  return iterator( const_cast<indirect_iterator>( pcl::LinearSearchLast( Begin(), End(), v ).it ) );
1814  }
1815 
1818  iterator SearchLast( const T* p ) const
1819  {
1820  return iterator( m_array.SearchLast( p ) );
1821  }
1822 
1825  template <class BP>
1826  iterator SearchLast( const T& v, BP p ) const
1827  {
1828  return iterator( const_cast<indirect_iterator>( pcl::LinearSearchLast( Begin(), End(), v, p ).it ) );
1829  }
1830 
1833  template <class FI>
1834  iterator SearchSubset( FI i, FI j ) const
1835  {
1836  return iterator( const_cast<indirect_iterator>( pcl::Search( Begin(), End(), i, j ).it ) );
1837  }
1838 
1841  template <class FI, class BP>
1842  iterator SearchSubset( FI i, FI j, BP p ) const
1843  {
1844  return iterator( const_cast<indirect_iterator>( pcl::Search( Begin(), End(), i, j, p ).it ) );
1845  }
1846 
1849  template <class C>
1850  iterator SearchSubset( const C& c ) const
1851  {
1852  return iterator( const_cast<indirect_iterator>( pcl::Search( Begin(), End(), c.Begin(), c.End() ).it ) );
1853  }
1854 
1857  template <class C, class BP>
1858  iterator SearchSubset( const C& c, BP p ) const
1859  {
1860  return iterator( const_cast<indirect_iterator>( pcl::Search( Begin(), End(), c.Begin(), c.End(), p ).it ) );
1861  }
1862 
1865  template <class BI>
1866  iterator SearchLastSubset( BI i, BI j ) const
1867  {
1868  return iterator( const_cast<indirect_iterator>( pcl::SearchLast( Begin(), End(), i, j ).it ) );
1869  }
1870 
1873  template <class BI, class BP>
1874  iterator SearchLastSubset( BI i, BI j, BP p ) const
1875  {
1876  return iterator( const_cast<indirect_iterator>( pcl::SearchLast( Begin(), End(), i, j, p ).it ) );
1877  }
1878 
1881  template <class C>
1882  iterator SearchLastSubset( const C& c ) const
1883  {
1884  return iterator( const_cast<indirect_iterator>( pcl::SearchLast( Begin(), End(), c.Begin(), c.End() ).it ) );
1885  }
1886 
1889  template <class C, class BP>
1890  iterator SearchLastSubset( const C& c, BP p ) const
1891  {
1892  return iterator( const_cast<indirect_iterator>( pcl::SearchLast( Begin(), End(), c.Begin(), c.End(), p ).it ) );
1893  }
1894 
1897  bool Contains( const T& v ) const
1898  {
1899  return Search( v ) != End();
1900  }
1901 
1904  bool Contains( const T* p ) const
1905  {
1906  return m_array.Contains( p );
1907  }
1908 
1911  template <class BP>
1912  bool Contains( const T& v, BP p ) const
1913  {
1914  return Search( v, p ) != End();
1915  }
1916 
1919  template <class FI>
1920  iterator ContainsSubset( FI i, FI j ) const
1921  {
1922  return SearchSubset( i, j ) != End();
1923  }
1924 
1927  template <class FI, class BP>
1928  iterator ContainsSubset( FI i, FI j, BP p ) const
1929  {
1930  return SearchSubset( i, j, p ) != End();
1931  }
1932 
1935  template <class C>
1936  iterator ContainsSubset( const C& c ) const
1937  {
1938  return m_array.ContainsSubset( c );
1939  }
1940 
1943  template <class C, class BP>
1944  iterator ContainsSubset( const C& c, BP p ) const
1945  {
1946  return SearchSubset( c ) != End();
1947  }
1948 
1951  void Sort()
1952  {
1953  pcl::QuickSort( m_array.Begin(), m_array.End(),
1954  []( const T* a, const T* b ){ return *a < *b; } );
1955  }
1956 
1959  template <class BP>
1960  void Sort( BP p )
1961  {
1962  pcl::QuickSort( m_array.Begin(), m_array.End(),
1963  [p]( const T* a, const T* b ){ return p( *a, *b ); } );
1964  }
1965 
1969  friend void Swap( ReferenceArray& x1, ReferenceArray& x2 )
1970  {
1971  pcl::Swap( x1.m_array, x2.m_array );
1972  }
1973 
1990  template <class S, typename SP>
1991  S& ToSeparated( S& s, SP separator ) const
1992  {
1993  const_iterator i = Begin();
1994  if ( i < End() )
1995  {
1996  s.Append( S( *i ) );
1997  if ( ++i < End() )
1998  do
1999  {
2000  s.Append( separator );
2001  s.Append( S( *i ) );
2002  }
2003  while ( ++i < End() );
2004  }
2005  return s;
2006  }
2007 
2030  template <class S, typename SP, class AF>
2031  S& ToSeparated( S& s, SP separator, AF append ) const
2032  {
2033  const_iterator i = Begin();
2034  if ( i < End() )
2035  {
2036  append( s, S( *i ) );
2037  if ( ++i < End() )
2038  {
2039  S p( separator );
2040  do
2041  {
2042  append( s, p );
2043  append( s, S( *i ) );
2044  }
2045  while ( ++i < End() );
2046  }
2047  }
2048  return s;
2049  }
2050 
2059  template <class S>
2060  S& ToCommaSeparated( S& s ) const
2061  {
2062  return ToSeparated( s, ',' );
2063  }
2064 
2073  template <class S>
2074  S& ToSpaceSeparated( S& s ) const
2075  {
2076  return ToSeparated( s, ' ' );
2077  }
2078 
2087  template <class S>
2088  S& ToTabSeparated( S& s ) const
2089  {
2090  return ToSeparated( s, '\t' );
2091  }
2092 
2101  template <class S>
2102  S& ToNewLineSeparated( S& s ) const
2103  {
2104  return ToSeparated( s, '\n' );
2105  }
2106 
2117  uint64 Hash64( uint64 seed = 0 ) const
2118  {
2119  return m_array.Hash64( seed );
2120  }
2121 
2132  uint32 Hash32( uint32 seed = 0 ) const
2133  {
2134  return m_array.Hash32( seed );
2135  }
2136 
2141  uint64 Hash( uint64 seed = 0 ) const
2142  {
2143  return Hash64( seed );
2144  }
2145 
2146 private:
2147 
2148  array_implementation m_array;
2149 
2150  template <class C>
2151  void CloneObjects( const C& x, DirectContainer<T>* )
2152  {
2153  m_array.CloneAssign( x );
2154  }
2155 
2156  template <class C>
2157  void CloneObjects( const C& x, IndirectContainer<T>* )
2158  {
2159  m_array.Clear();
2160  m_array.Reserve( x.Length() );
2161  allocator a;
2162  for ( typename C::const_iterator p = x.Begin(); p != x.End(); ++p )
2163  if ( *p != nullptr )
2164  {
2165  T* o = a.Allocate( 1 );
2166  pcl::Construct( o, **p, a );
2167  m_array.Append( o );
2168  }
2169  }
2170 };
2171 
2172 // ----------------------------------------------------------------------------
2173 
2180 template <class T, class A> inline
2182 {
2183  return x1.Length() == x2.Length() && pcl::Equal( x1.Begin(), x2.Begin(), x2.End() );
2184 }
2185 
2192 template <class T, class A> inline
2194 {
2195  return pcl::Compare( x1.Begin(), x1.End(), x2.Begin(), x2.End() ) < 0;
2196 }
2197 
2205 template <class T, class A, class V> inline
2206 ReferenceArray<T,A>& operator <<( ReferenceArray<T,A>& x, const V* p )
2207 {
2208  x.Append( static_cast<const T*>( p ) );
2209  return x;
2210 }
2211 
2219 template <class T, class A, class V> inline
2220 ReferenceArray<T,A>& operator <<( ReferenceArray<T,A>&& x, const V* p )
2221 {
2222  x.Append( static_cast<const T*>( p ) );
2223  return x;
2224 }
2225 
2231 template <class T, class A> inline
2232 ReferenceArray<T,A>& operator <<( ReferenceArray<T,A>& x1, const ReferenceArray<T,A>& x2 )
2233 {
2234  x1.Append( x2 );
2235  return x1;
2236 }
2237 
2243 template <class T, class A> inline
2244 ReferenceArray<T,A>& operator <<( ReferenceArray<T,A>&& x1, const ReferenceArray<T,A>& x2 )
2245 {
2246  x1.Append( x2 );
2247  return x1;
2248 }
2249 
2250 // ----------------------------------------------------------------------------
2251 
2252 } // pcl
2253 
2254 #endif // __PCL_ReferenceArray_h
2255 
2256 // ----------------------------------------------------------------------------
2257 // EOF pcl/ReferenceArray.h - Released 2024-05-07T15:27:32Z
Provides memory allocation for PCL containers.
Definition: Allocator.h:132
Root base class of all PCL containers of objects.
Definition: Container.h:78
Generic dynamic array of pointers to objects.
Definition: IndirectArray.h:92
T *const * const_iterator
void Append(const IndirectArray &x)
Random access iterator class.
Definition: Iterator.h:94
Immutable ReferenceArray iterator.
const_iterator(const const_iterator &)=default
Immutable ReferenceArray reverse iterator.
Mutable ReferenceArray iterator.
iterator(const iterator &)=default
Mutable ReferenceArray reverse iterator.
Dynamic array of pointers to objects providing direct iteration and element access by reference.
void CloneAssign(const C &x)
iterator SearchLast(const T &v) const
void Apply(F f) const
iterator SearchLastSubset(const C &c) const
size_type Length() const
iterator Insert(const_iterator i, FI p, FI q)
iterator ContainsSubset(FI i, FI j, BP p) const
iterator Insert(const_iterator i, const T *p, size_type n=1)
iterator SearchLast(const T &v, BP p) const
iterator At(size_type i)
iterator Search(const T *p) const
reverse_iterator ReverseBegin()
void RemovePointer(const T *p)
void Remove(const T &v, BP p)
void Destroy(const T &v)
void Assign(const ReferenceArray &x)
void ShiftLeft(const T *p, size_type n=1)
const_reverse_iterator ConstReverseBegin() const
ReferenceArray(FI i, FI j)
const_iterator ConstBegin() const
iterator Search(const T &v, BP p) const
iterator Replace(const_iterator i, const_iterator j, const T *p, size_type n=1)
iterator MaxItem() const
iterator ContainsSubset(FI i, FI j) const
const_reverse_iterator ReverseEnd() const
void Transfer(ReferenceArray &&x)
size_type Size() const
iterator MaxItem(BP p) const
const_reverse_iterator ConstReverseEnd() const
size_type Count(const T *p) const
void Destroy(iterator i, iterator j)
size_type Capacity() const
iterator MutableIterator(const_iterator i)
iterator LastThat(F f) const
void Append(const T *p, size_type n=1)
void Destroy(iterator i, size_type n=1)
void Append(const ReferenceArray &x)
bool IsValid() const
void Assign(const T *p, size_type n=1)
const_iterator ConstEnd() const
typename array_implementation::iterator indirect_iterator
void UniquifyIterators(iterator &i, iterator &j)
void Prepend(const T *p, size_type n=1)
void Add(FI i, FI j)
void Fill(const T &v)
uint32 Hash32(uint32 seed=0) const
size_type Count(const T &v) const
friend void Swap(ReferenceArray &x1, ReferenceArray &x2)
size_type CountIf(UP p) const
void Destroy(const T &v, BP p)
bool Contains(const T *p) const
iterator SearchSubset(const C &c, BP p) const
const_reverse_iterator ReverseBegin() const
const allocator & Allocator() const
iterator FirstThat(F f) const
const_iterator begin() const
void Assign(FI i, FI j)
size_type Available() const
reverse_iterator ReverseEnd()
size_type Count(const T &v, BP p) const
void Reserve(size_type n)
bool Contains(const T &v) const
void Remove(const T &v)
uint64 Hash64(uint64 seed=0) const
void Remove(const_iterator i, const_iterator j)
const_iterator Begin() const
iterator SearchLastSubset(BI i, BI j) const
void ShiftRight(const T *p, size_type n=1)
iterator SearchSubset(FI i, FI j) const
iterator ContainsSubset(const C &c, BP p) const
bool IsEmpty() const
const_iterator End() const
bool Contains(const T &v, BP p) const
indirect_iterator Release()
iterator SearchSubset(const C &c) const
void Add(const ReferenceArray &x)
iterator SearchLast(const T *p) const
void Remove(const_iterator i, size_type n=1)
typename array_implementation::const_iterator const_indirect_iterator
void Add(const T *p, size_type n=1)
iterator SearchSubset(FI i, FI j, BP p) const
typename array_implementation::allocator allocator
iterator MinItem(BP p) const
iterator Replace(const_iterator i, const_iterator j, const ReferenceArray &x)
ReferenceArray(size_type n, const T *p)
void UniquifyIterator(iterator &i)
ReferenceArray(ReferenceArray &&)=default
bool IsAliasOf(const ReferenceArray &x) const
size_type LowerBound() const
ReferenceArray()=default
void SetAllocator(const allocator &a)
void Prepend(const ReferenceArray &x)
iterator Insert(const_iterator i, const ReferenceArray &x)
void Shrink(size_type n=1)
bool IsUnique() const
const_iterator At(size_type i) const
uint64 Hash(uint64 seed=0) const
iterator Search(const T &v) const
size_type UpperBound() const
void Prepend(FI p, FI q)
void Transfer(ReferenceArray &x)
void Append(FI p, FI q)
iterator SearchLastSubset(const C &c, BP p) const
iterator Replace(const_iterator i, const_iterator j, FI p, FI q)
void Rotate(distance_type n)
typename array_implementation::block_allocator block_allocator
iterator ContainsSubset(const C &c) const
const_iterator end() const
void Truncate(const_iterator i)
iterator SearchLastSubset(BI i, BI j, BP p) const
void Import(iterator i, iterator j)
iterator MinItem() const
ReferenceArray(const ReferenceArray &)=default
Reverse random access iterator.
Definition: Iterator.h:420
Array< T, A > & operator<<(Array< T, A > &x, const V &v)
Definition: Array.h:2118
bool operator==(const Array< T, A > &x1, const Array< T, A > &x2) noexcept
Definition: Array.h:2090
bool operator<(const Array< T, A > &x1, const Array< T, A > &x2) noexcept
Definition: Array.h:2101
Complex< T1 > operator-(const Complex< T1 > &c1, const Complex< T2 > &c2) noexcept
Definition: Complex.h:504
Complex< T1 > operator*(const Complex< T1 > &c1, const Complex< T2 > &c2) noexcept
Definition: Complex.h:548
Complex< T1 > operator+(const Complex< T1 > &c1, const Complex< T2 > &c2) noexcept
Definition: Complex.h:464
uint64 Hash64(const void *data, size_type size, uint64 seed=0) noexcept
Definition: Math.h:4750
void Construct(T *p, A &a)
Definition: Allocator.h:247
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 LinearSearch(FI i, FI j, const T &v) noexcept
Definition: Search.h:91
BI1 SearchLast(BI1 i1, BI1 j1, FI2 i2, FI2 j2) noexcept
Definition: Search.h:449
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
ptrdiff_t distance_type
Definition: Defs.h:615
size_t size_type
Definition: Defs.h:609
void QuickSort(RI i, RI j)
Definition: Sort.h:236
size_type CountIf(FI i, FI j, UP p) noexcept(noexcept(p))
Definition: Utility.h:423
BI LastThat(BI i, BI j, UP p) noexcept(noexcept(p))
Definition: Utility.h:350
size_type Count(FI i, FI j, const T &v) noexcept
Definition: Utility.h:384
FI MinItem(FI i, FI j) noexcept
Definition: Utility.h:441
bool Equal(FI1 i1, FI2 i2, FI2 j2) noexcept
Definition: Utility.h:592
int Compare(FI1 i1, FI1 j1, FI2 i2, FI2 j2) noexcept
Definition: Utility.h:639
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
Generic container iterator.
Definition: Iterator.h:105
T item_type
Represents the item type.
Definition: Iterator.h:107