Container.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. //-----------------------------------------------------------------------------
  2. // Basler pylon SDK
  3. // Copyright (c) 2006-2021 Basler AG
  4. // http://www.baslerweb.com
  5. // Author: AH
  6. //-----------------------------------------------------------------------------
  7. /*!
  8. \file
  9. \brief Definition of the DeviceInfoList_t, TLInfoList_t, and InterfaceInfoList_t classes
  10. */
  11. #ifndef __CONTAINER_H__
  12. #define __CONTAINER_H__
  13. #if _MSC_VER > 1000
  14. #pragma once
  15. #endif // _MSC_VER > 1000
  16. #include <pylon/Platform.h>
  17. #ifdef _MSC_VER
  18. # pragma pack(push, PYLON_PACKING)
  19. #endif /* _MSC_VER */
  20. #include <pylon/PylonBase.h>
  21. #include <pylon/DeviceInfo.h>
  22. #include <pylon/TlInfo.h>
  23. #include <pylon/InterfaceInfo.h>
  24. #include <vector>
  25. namespace Pylon
  26. {
  27. // ---------------------------------------------------------------------------
  28. ///
  29. /// \brief STL std::vector like container class.
  30. /*!
  31. // Based on the GenICam::gcstring_vector class.
  32. */
  33. // ---------------------------------------------------------------------------
  34. template <class T>
  35. class PYLONBASE_API TList
  36. {
  37. public:
  38. typedef T* pointer;
  39. typedef const T* const_pointer;
  40. typedef T& reference;
  41. typedef const T& const_reference;
  42. // Nested types
  43. // ---------------------------------------------------------------------------
  44. public:
  45. // \brief Const iterator for the DeviceInfoList container.
  46. class PYLONBASE_API const_iterator
  47. {
  48. // iterator traits
  49. // ------------------------------------------------------------------------
  50. public:
  51. typedef std::random_access_iterator_tag iterator_category;
  52. typedef T value_type;
  53. typedef ptrdiff_t difference_type;
  54. typedef T* pointer;
  55. typedef T& reference;
  56. // Ctor / Dtor
  57. // -------------------------------------------------------------------------
  58. public:
  59. const_iterator( T* pPtr = 0 );
  60. // Operators
  61. // -------------------------------------------------------------------------
  62. public:
  63. const T& operator * ( void ) const;
  64. const T* operator -> () const;
  65. const_iterator& operator ++ ( void );
  66. const_iterator operator ++ ( int );
  67. const_iterator& operator -- ( void );
  68. const_iterator operator -- ( int );
  69. const_iterator& operator += ( const intptr_t& iInc );
  70. const_iterator operator + ( intptr_t iInc ) const;
  71. const_iterator& operator -= ( const intptr_t& iDec );
  72. intptr_t operator - ( const const_iterator& iter ) const;
  73. const_iterator operator - ( intptr_t iDec ) const;
  74. const T& operator [] ( intptr_t iIndex ) const;
  75. bool operator == ( const const_iterator& iter ) const;
  76. bool operator != ( const const_iterator& iter ) const;
  77. bool operator < ( const const_iterator& iter ) const;
  78. bool operator > ( const const_iterator& iter ) const;
  79. bool operator <= ( const const_iterator& iter ) const;
  80. bool operator >= ( const const_iterator& iter ) const;
  81. template <class U> PYLONBASE_API friend typename TList<T>::const_iterator operator +( intptr_t iInc, const typename TList<T>::const_iterator& iter );
  82. // Member
  83. // -------------------------------------------------------------------------
  84. protected:
  85. T* _ps;
  86. };
  87. class PYLONBASE_API iterator :
  88. public const_iterator
  89. {
  90. public:
  91. // iterator traits
  92. // -------------------------------------------------------------------------
  93. typedef std::random_access_iterator_tag iterator_category;
  94. typedef T value_type;
  95. typedef ptrdiff_t difference_type;
  96. typedef T* pointer;
  97. typedef T& reference;
  98. // Ctor / Dtor
  99. // -------------------------------------------------------------------------
  100. public:
  101. iterator( T* pPtr = 0 );
  102. // Operators
  103. // -------------------------------------------------------------------------
  104. public:
  105. T& operator * ( void ) const;
  106. T* operator -> () const;
  107. iterator& operator ++ ( void );
  108. iterator operator ++ ( int );
  109. iterator& operator -- ( void );
  110. iterator operator -- ( int );
  111. iterator& operator += ( const intptr_t& iInc );
  112. iterator operator + ( intptr_t iInc ) const;
  113. iterator& operator -= ( const intptr_t& iDec );
  114. intptr_t operator - ( const iterator& iter ) const;
  115. iterator operator - ( intptr_t iDec ) const;
  116. T& operator [] ( intptr_t iIndex ) const;
  117. template <class U> PYLONBASE_API friend typename TList<T>::iterator operator +( intptr_t iInc, const typename TList<T>::iterator& iter );
  118. };
  119. // Ctor / Dtor
  120. // ---------------------------------------------------------------------------
  121. public:
  122. TList( void );
  123. explicit TList( size_t uiSize );
  124. TList( const TList& obj );
  125. virtual ~TList( void );
  126. // Element access
  127. // ---------------------------------------------------------------------------
  128. public:
  129. virtual void assign( size_t n, const T& val );
  130. virtual void clear( void );
  131. virtual iterator erase( iterator pos );
  132. virtual T& at( size_t uiIndex );
  133. virtual const T& at( size_t uiIndex ) const;
  134. virtual T& back( void );
  135. virtual const T& back( void ) const;
  136. virtual iterator begin( void );
  137. virtual const_iterator begin( void ) const;
  138. virtual size_t capacity( void ) const;
  139. virtual iterator end( void );
  140. virtual const_iterator end( void ) const;
  141. virtual T& front( void );
  142. virtual const T& front( void ) const;
  143. virtual size_t max_size( void ) const;
  144. virtual size_t size( void ) const;
  145. virtual iterator insert( iterator pos, const T& val );
  146. virtual bool empty( void ) const;
  147. virtual void pop_back( void );
  148. virtual void push_back( const T& val );
  149. virtual void resize( size_t uiSize );
  150. virtual void reserve( size_t uiSize );
  151. // Do not use - only left in for backwards compatibility!
  152. virtual void erase( size_t uiIndex );
  153. virtual void insert( size_t uiIndex, const T& val );
  154. // Operators
  155. // ---------------------------------------------------------------------------
  156. public:
  157. TList& operator = ( const TList& obj );
  158. T& operator [] ( size_t uiIndex );
  159. const T& operator [] ( size_t uiIndex ) const;
  160. void operator delete (void* pWhere);
  161. void* operator new (size_t uiSize);
  162. // Member
  163. // ---------------------------------------------------------------------------
  164. private:
  165. typedef std::vector<T, std::allocator<T> > vector_t;
  166. vector_t* _pv;
  167. };
  168. // ---------------------------------------------------------------------------
  169. /// \brief Gets the sum of the given \a iInc and the given \a iter.
  170. ///
  171. /// \param[in] iInc Increment from which the sum is calculated.
  172. /// \param[in] iter Iterator from which the sum is calculated.
  173. /// \return Sum of iterator.
  174. // ---------------------------------------------------------------------------
  175. template<class T>
  176. typename TList<T>::iterator PYLONBASE_API operator +( intptr_t iInc, const typename TList<T>::iterator& iter );
  177. #ifndef PYLONBASE_EXPORT_TEMPLATE
  178. #ifdef _MSC_VER
  179. #pragma warning(push)
  180. #pragma warning(disable:4231 4910) // Nonstandard extension used : 'extern' before template explicit instantiation
  181. #endif
  182. extern template class PYLONBASE_API TList<CDeviceInfo>;
  183. #ifdef _MSC_VER
  184. #pragma warning(pop)
  185. #endif
  186. #endif
  187. /////////////////////////////////////////////////////////////////////////////////////////
  188. //
  189. // DeviceInfoList
  190. //
  191. /////////////////////////////////////////////////////////////////////////////////////////
  192. ///
  193. /// \brief STL std::vector like container for Pylon::CDeviceInfo objects.
  194. /*!
  195. // \ingroup Pylon_TransportLayer
  196. */
  197. // ---------------------------------------------------------------------------
  198. class PYLONBASE_API DeviceInfoList : public TList<CDeviceInfo>
  199. {
  200. public:
  201. DeviceInfoList( void );
  202. explicit DeviceInfoList( size_t uiSize );
  203. DeviceInfoList( const DeviceInfoList& obj );
  204. virtual ~DeviceInfoList( void );
  205. };
  206. /// \copybrief Pylon::DeviceInfoList
  207. /*! \copydoc Pylon::DeviceInfoList */
  208. typedef DeviceInfoList DeviceInfoList_t;
  209. /////////////////////////////////////////////////////////////////////////////////////////
  210. //
  211. // TlInfoList
  212. //
  213. /////////////////////////////////////////////////////////////////////////////////////////
  214. // ---------------------------------------------------------------------------
  215. /*!
  216. // \brief STL std::vector like container for Pylon::CTlInfo objects.
  217. //
  218. // \ingroup Pylon_TransportLayer
  219. */
  220. // ---------------------------------------------------------------------------
  221. class PYLONBASE_API TlInfoList : public TList<CTlInfo>
  222. {
  223. public:
  224. TlInfoList( void );
  225. explicit TlInfoList( size_t uiSize );
  226. TlInfoList( const TlInfoList& obj );
  227. virtual ~TlInfoList( void );
  228. };
  229. /*!
  230. \copybrief Pylon::TlInfoList
  231. \copydoc Pylon::TlInfoList
  232. */
  233. typedef TlInfoList TlInfoList_t;
  234. /////////////////////////////////////////////////////////////////////////////////////////
  235. //
  236. // InterfaceInfoList
  237. //
  238. /////////////////////////////////////////////////////////////////////////////////////////
  239. // ---------------------------------------------------------------------------
  240. /*!
  241. // \brief STL std::vector like container for Pylon::CInterfaceInfo objects.
  242. //
  243. */
  244. // ---------------------------------------------------------------------------
  245. class PYLONBASE_API InterfaceInfoList : public TList<CInterfaceInfo>
  246. {
  247. public:
  248. InterfaceInfoList( void );
  249. explicit InterfaceInfoList( size_t uiSize );
  250. InterfaceInfoList( const InterfaceInfoList& obj );
  251. virtual ~InterfaceInfoList( void );
  252. };
  253. /*!
  254. \copybrief Pylon::InterfaceInfoList
  255. \copydoc Pylon::InterfaceInfoList
  256. */
  257. typedef InterfaceInfoList InterfaceInfoList_t;
  258. }
  259. #ifdef _MSC_VER
  260. # pragma pack(pop)
  261. #endif /* _MSC_VER */
  262. #endif //__CONTAINER_H__