field_bones.hpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
  2. // Copyright 2008-2016 National ICT Australia (NICTA)
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. // ------------------------------------------------------------------------
  15. //! \addtogroup field
  16. //! @{
  17. struct field_prealloc_n_elem
  18. {
  19. static const uword val = 16;
  20. };
  21. //! A lightweight 1D/2D/3D container for arbitrary objects
  22. //! (the objects must have a copy constructor)
  23. template<typename oT>
  24. class field
  25. {
  26. public:
  27. typedef oT object_type;
  28. const uword n_rows; //!< number of rows (read-only)
  29. const uword n_cols; //!< number of columns (read-only)
  30. const uword n_slices; //!< number of slices (read-only)
  31. const uword n_elem; //!< number of elements (read-only)
  32. private:
  33. arma_aligned oT** mem; //!< pointers to stored objects
  34. arma_aligned oT* mem_local[ field_prealloc_n_elem::val ]; //!< local storage, for small fields
  35. public:
  36. inline ~field();
  37. inline field();
  38. inline field(const field& x);
  39. inline field& operator=(const field& x);
  40. inline field(const subview_field<oT>& x);
  41. inline field& operator=(const subview_field<oT>& x);
  42. inline explicit field(const uword n_elem_in);
  43. inline explicit field(const uword n_rows_in, const uword n_cols_in);
  44. inline explicit field(const uword n_rows_in, const uword n_cols_in, const uword n_slices_in);
  45. inline explicit field(const SizeMat& s);
  46. inline explicit field(const SizeCube& s);
  47. inline void set_size(const uword n_obj_in);
  48. inline void set_size(const uword n_rows_in, const uword n_cols_in);
  49. inline void set_size(const uword n_rows_in, const uword n_cols_in, const uword n_slices_in);
  50. inline void set_size(const SizeMat& s);
  51. inline void set_size(const SizeCube& s);
  52. #if defined(ARMA_USE_CXX11)
  53. inline field(const std::initializer_list<oT>& list);
  54. inline field& operator=(const std::initializer_list<oT>& list);
  55. inline field(const std::initializer_list< std::initializer_list<oT> >& list);
  56. inline field& operator=(const std::initializer_list< std::initializer_list<oT> >& list);
  57. inline field(field&& X);
  58. inline field& operator=(field&& X);
  59. #endif
  60. template<typename oT2>
  61. inline void copy_size(const field<oT2>& x);
  62. arma_inline oT& operator[](const uword i);
  63. arma_inline const oT& operator[](const uword i) const;
  64. arma_inline oT& at(const uword i);
  65. arma_inline const oT& at(const uword i) const;
  66. arma_inline oT& operator()(const uword i);
  67. arma_inline const oT& operator()(const uword i) const;
  68. arma_inline oT& at(const uword row, const uword col);
  69. arma_inline const oT& at(const uword row, const uword col) const;
  70. arma_inline oT& at(const uword row, const uword col, const uword slice);
  71. arma_inline const oT& at(const uword row, const uword col, const uword slice) const;
  72. arma_inline oT& operator()(const uword row, const uword col);
  73. arma_inline const oT& operator()(const uword row, const uword col) const;
  74. arma_inline oT& operator()(const uword row, const uword col, const uword slice);
  75. arma_inline const oT& operator()(const uword row, const uword col, const uword slice) const;
  76. inline field_injector<field> operator<<(const oT& val);
  77. inline field_injector<field> operator<<(const injector_end_of_row<>& x);
  78. inline subview_field<oT> row(const uword row_num);
  79. inline const subview_field<oT> row(const uword row_num) const;
  80. inline subview_field<oT> col(const uword col_num);
  81. inline const subview_field<oT> col(const uword col_num) const;
  82. inline subview_field<oT> slice(const uword slice_num);
  83. inline const subview_field<oT> slice(const uword slice_num) const;
  84. inline subview_field<oT> rows(const uword in_row1, const uword in_row2);
  85. inline const subview_field<oT> rows(const uword in_row1, const uword in_row2) const;
  86. inline subview_field<oT> cols(const uword in_col1, const uword in_col2);
  87. inline const subview_field<oT> cols(const uword in_col1, const uword in_col2) const;
  88. inline subview_field<oT> slices(const uword in_slice1, const uword in_slice2);
  89. inline const subview_field<oT> slices(const uword in_slice1, const uword in_slice2) const;
  90. inline subview_field<oT> subfield(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2);
  91. inline const subview_field<oT> subfield(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const;
  92. inline subview_field<oT> subfield(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2);
  93. inline const subview_field<oT> subfield(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2) const;
  94. inline subview_field<oT> subfield(const uword in_row1, const uword in_col1, const SizeMat& s);
  95. inline const subview_field<oT> subfield(const uword in_row1, const uword in_col1, const SizeMat& s) const;
  96. inline subview_field<oT> subfield(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s);
  97. inline const subview_field<oT> subfield(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) const;
  98. inline subview_field<oT> subfield(const span& row_span, const span& col_span);
  99. inline const subview_field<oT> subfield(const span& row_span, const span& col_span) const;
  100. inline subview_field<oT> subfield(const span& row_span, const span& col_span, const span& slice_span);
  101. inline const subview_field<oT> subfield(const span& row_span, const span& col_span, const span& slice_span) const;
  102. inline subview_field<oT> operator()(const span& row_span, const span& col_span);
  103. inline const subview_field<oT> operator()(const span& row_span, const span& col_span) const;
  104. inline subview_field<oT> operator()(const span& row_span, const span& col_span, const span& slice_span);
  105. inline const subview_field<oT> operator()(const span& row_span, const span& col_span, const span& slice_span) const;
  106. inline subview_field<oT> operator()(const uword in_row1, const uword in_col1, const SizeMat& s);
  107. inline const subview_field<oT> operator()(const uword in_row1, const uword in_col1, const SizeMat& s) const;
  108. inline subview_field<oT> operator()(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s);
  109. inline const subview_field<oT> operator()(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) const;
  110. arma_cold inline void print( const std::string extra_text = "") const;
  111. arma_cold inline void print(std::ostream& user_stream, const std::string extra_text = "") const;
  112. #if defined(ARMA_USE_CXX11)
  113. inline const field& for_each(const std::function< void( oT&) >& F);
  114. inline const field& for_each(const std::function< void(const oT&) >& F) const;
  115. #else
  116. template<typename functor> inline const field& for_each(functor F);
  117. template<typename functor> inline const field& for_each(functor F) const;
  118. #endif
  119. inline const field& fill(const oT& x);
  120. inline void reset();
  121. inline void reset_objects();
  122. arma_inline bool is_empty() const;
  123. arma_inline arma_warn_unused bool in_range(const uword i) const;
  124. arma_inline arma_warn_unused bool in_range(const span& x) const;
  125. arma_inline arma_warn_unused bool in_range(const uword in_row, const uword in_col) const;
  126. arma_inline arma_warn_unused bool in_range(const span& row_span, const uword in_col) const;
  127. arma_inline arma_warn_unused bool in_range(const uword in_row, const span& col_span) const;
  128. arma_inline arma_warn_unused bool in_range(const span& row_span, const span& col_span) const;
  129. arma_inline arma_warn_unused bool in_range(const uword in_row, const uword in_col, const SizeMat& s) const;
  130. arma_inline arma_warn_unused bool in_range(const uword in_row, const uword in_col, const uword in_slice) const;
  131. arma_inline arma_warn_unused bool in_range(const span& row_span, const span& col_span, const span& slice_span) const;
  132. arma_inline arma_warn_unused bool in_range(const uword in_row, const uword in_col, const uword in_slice, const SizeCube& s) const;
  133. inline arma_cold bool save(const std::string name, const file_type type = arma_binary, const bool print_status = true) const;
  134. inline arma_cold bool save( std::ostream& os, const file_type type = arma_binary, const bool print_status = true) const;
  135. inline arma_cold bool load(const std::string name, const file_type type = auto_detect, const bool print_status = true);
  136. inline arma_cold bool load( std::istream& is, const file_type type = auto_detect, const bool print_status = true);
  137. inline arma_cold bool quiet_save(const std::string name, const file_type type = arma_binary) const;
  138. inline arma_cold bool quiet_save( std::ostream& os, const file_type type = arma_binary) const;
  139. inline arma_cold bool quiet_load(const std::string name, const file_type type = auto_detect);
  140. inline arma_cold bool quiet_load( std::istream& is, const file_type type = auto_detect);
  141. // for container-like functionality
  142. typedef oT value_type;
  143. typedef uword size_type;
  144. class iterator
  145. {
  146. public:
  147. inline iterator(field<oT>& in_M, const bool at_end = false);
  148. inline oT& operator* ();
  149. inline iterator& operator++();
  150. inline void operator++(int);
  151. inline iterator& operator--();
  152. inline void operator--(int);
  153. inline bool operator!=(const iterator& X) const;
  154. inline bool operator==(const iterator& X) const;
  155. arma_aligned field<oT>& M;
  156. arma_aligned uword i;
  157. };
  158. class const_iterator
  159. {
  160. public:
  161. const_iterator(const field<oT>& in_M, const bool at_end = false);
  162. const_iterator(const iterator& X);
  163. inline const oT& operator*() const;
  164. inline const_iterator& operator++();
  165. inline void operator++(int);
  166. inline const_iterator& operator--();
  167. inline void operator--(int);
  168. inline bool operator!=(const const_iterator& X) const;
  169. inline bool operator==(const const_iterator& X) const;
  170. arma_aligned const field<oT>& M;
  171. arma_aligned uword i;
  172. };
  173. inline iterator begin();
  174. inline const_iterator begin() const;
  175. inline const_iterator cbegin() const;
  176. inline iterator end();
  177. inline const_iterator end() const;
  178. inline const_iterator cend() const;
  179. inline void clear();
  180. inline bool empty() const;
  181. inline uword size() const;
  182. private:
  183. inline void init(const field<oT>& x);
  184. inline void init(const uword n_rows_in, const uword n_cols_in);
  185. inline void init(const uword n_rows_in, const uword n_cols_in, const uword n_slices_in);
  186. inline void delete_objects();
  187. inline void create_objects();
  188. friend class field_aux;
  189. friend class subview_field<oT>;
  190. public:
  191. #ifdef ARMA_EXTRA_FIELD_PROTO
  192. #include ARMA_INCFILE_WRAP(ARMA_EXTRA_FIELD_PROTO)
  193. #endif
  194. };
  195. class field_aux
  196. {
  197. public:
  198. template<typename oT> inline static void reset_objects(field< oT >& x);
  199. template<typename eT> inline static void reset_objects(field< Mat<eT> >& x);
  200. template<typename eT> inline static void reset_objects(field< Col<eT> >& x);
  201. template<typename eT> inline static void reset_objects(field< Row<eT> >& x);
  202. template<typename eT> inline static void reset_objects(field< Cube<eT> >& x);
  203. inline static void reset_objects(field< std::string >& x);
  204. template<typename oT> inline static bool save(const field< oT >& x, const std::string& name, const file_type type, std::string& err_msg);
  205. template<typename oT> inline static bool save(const field< oT >& x, std::ostream& os, const file_type type, std::string& err_msg);
  206. template<typename oT> inline static bool load( field< oT >& x, const std::string& name, const file_type type, std::string& err_msg);
  207. template<typename oT> inline static bool load( field< oT >& x, std::istream& is, const file_type type, std::string& err_msg);
  208. template<typename eT> inline static bool save(const field< Mat<eT> >& x, const std::string& name, const file_type type, std::string& err_msg);
  209. template<typename eT> inline static bool save(const field< Mat<eT> >& x, std::ostream& os, const file_type type, std::string& err_msg);
  210. template<typename eT> inline static bool load( field< Mat<eT> >& x, const std::string& name, const file_type type, std::string& err_msg);
  211. template<typename eT> inline static bool load( field< Mat<eT> >& x, std::istream& is, const file_type type, std::string& err_msg);
  212. template<typename eT> inline static bool save(const field< Col<eT> >& x, const std::string& name, const file_type type, std::string& err_msg);
  213. template<typename eT> inline static bool save(const field< Col<eT> >& x, std::ostream& os, const file_type type, std::string& err_msg);
  214. template<typename eT> inline static bool load( field< Col<eT> >& x, const std::string& name, const file_type type, std::string& err_msg);
  215. template<typename eT> inline static bool load( field< Col<eT> >& x, std::istream& is, const file_type type, std::string& err_msg);
  216. template<typename eT> inline static bool save(const field< Row<eT> >& x, const std::string& name, const file_type type, std::string& err_msg);
  217. template<typename eT> inline static bool save(const field< Row<eT> >& x, std::ostream& os, const file_type type, std::string& err_msg);
  218. template<typename eT> inline static bool load( field< Row<eT> >& x, const std::string& name, const file_type type, std::string& err_msg);
  219. template<typename eT> inline static bool load( field< Row<eT> >& x, std::istream& is, const file_type type, std::string& err_msg);
  220. template<typename eT> inline static bool save(const field< Cube<eT> >& x, const std::string& name, const file_type type, std::string& err_msg);
  221. template<typename eT> inline static bool save(const field< Cube<eT> >& x, std::ostream& os, const file_type type, std::string& err_msg);
  222. template<typename eT> inline static bool load( field< Cube<eT> >& x, const std::string& name, const file_type type, std::string& err_msg);
  223. template<typename eT> inline static bool load( field< Cube<eT> >& x, std::istream& is, const file_type type, std::string& err_msg);
  224. inline static bool save(const field< std::string >& x, const std::string& name, const file_type type, std::string& err_msg);
  225. inline static bool save(const field< std::string >& x, std::ostream& os, const file_type type, std::string& err_msg);
  226. inline static bool load( field< std::string >& x, const std::string& name, const file_type type, std::string& err_msg);
  227. inline static bool load( field< std::string >& x, std::istream& is, const file_type type, std::string& err_msg);
  228. };
  229. //! @}