Mercurial > hg > segmenter-vamp-plugin
view armadillo-3.900.4/include/armadillo_bits/field_meat.hpp @ 84:55a047986812 tip
Update library URI so as not to be document-local
author | Chris Cannam |
---|---|
date | Wed, 22 Apr 2020 14:21:57 +0100 |
parents | 1ec0e2823891 |
children |
line wrap: on
line source
// Copyright (C) 2008-2011 NICTA (www.nicta.com.au) // Copyright (C) 2008-2013 Conrad Sanderson // Copyright (C) 2009-2010 Ian Cullinan // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. //! \addtogroup field //! @{ template<typename oT> inline field<oT>::~field() { arma_extra_debug_sigprint_this(this); delete_objects(); if(n_elem > sizeof(mem_local)/sizeof(oT*) ) { delete [] mem; } if(arma_config::debug == true) { // try to expose buggy user code that accesses deleted objects access::rw(n_rows) = 0; access::rw(n_cols) = 0; access::rw(n_elem) = 0; mem = 0; } } template<typename oT> inline field<oT>::field() : n_rows(0) , n_cols(0) , n_elem(0) , mem(0) { arma_extra_debug_sigprint_this(this); } //! construct a field from a given field template<typename oT> inline field<oT>::field(const field& x) : n_rows(0) , n_cols(0) , n_elem(0) , mem(0) { arma_extra_debug_sigprint(arma_boost::format("this = %x x = %x") % this % &x); init(x); } //! construct a field from a given field template<typename oT> inline const field<oT>& field<oT>::operator=(const field& x) { arma_extra_debug_sigprint(); init(x); return *this; } //! construct a field from subview_field (e.g. construct a field from a delayed subfield operation) template<typename oT> inline field<oT>::field(const subview_field<oT>& X) : n_rows(0) , n_cols(0) , n_elem(0) , mem(0) { arma_extra_debug_sigprint_this(this); this->operator=(X); } //! construct a field from subview_field (e.g. construct a field from a delayed subfield operation) template<typename oT> inline const field<oT>& field<oT>::operator=(const subview_field<oT>& X) { arma_extra_debug_sigprint(); subview_field<oT>::extract(*this, X); return *this; } //! construct the field with the specified number of elements, //! assuming a column-major layout template<typename oT> inline field<oT>::field(const uword n_elem_in) : n_rows(0) , n_cols(0) , n_elem(0) , mem(0) { arma_extra_debug_sigprint_this(this); init(n_elem_in, 1); } //! construct the field with the specified dimensions template<typename oT> inline field<oT>::field(const uword n_rows_in, const uword n_cols_in) : n_rows(0) , n_cols(0) , n_elem(0) , mem(0) { arma_extra_debug_sigprint_this(this); init(n_rows_in, n_cols_in); } //! change the field to have the specified number of elements, //! assuming a column-major layout (data is not preserved) template<typename oT> inline void field<oT>::set_size(const uword n_elem_in) { arma_extra_debug_sigprint(arma_boost::format("n_elem_in = %d") % n_elem_in); init(n_elem_in, 1); } //! change the field to have the specified dimensions (data is not preserved) template<typename oT> inline void field<oT>::set_size(const uword n_rows_in, const uword n_cols_in) { arma_extra_debug_sigprint(arma_boost::format("n_rows_in = %d, n_cols_in = %d") % n_rows_in % n_cols_in); init(n_rows_in, n_cols_in); } //! change the field to have the specified dimensions (data is not preserved) template<typename oT> template<typename oT2> inline void field<oT>::copy_size(const field<oT2>& x) { arma_extra_debug_sigprint(); init(x.n_rows, x.n_cols); } //! linear element accessor (treats the field as a vector); no bounds check template<typename oT> arma_inline oT& field<oT>::operator[] (const uword i) { return (*mem[i]); } //! linear element accessor (treats the field as a vector); no bounds check template<typename oT> arma_inline const oT& field<oT>::operator[] (const uword i) const { return (*mem[i]); } //! linear element accessor (treats the field as a vector); no bounds check template<typename oT> arma_inline oT& field<oT>::at(const uword i) { return (*mem[i]); } //! linear element accessor (treats the field as a vector); no bounds check template<typename oT> arma_inline const oT& field<oT>::at(const uword i) const { return (*mem[i]); } //! linear element accessor (treats the field as a vector); bounds checking not done when ARMA_NO_DEBUG is defined template<typename oT> arma_inline oT& field<oT>::operator() (const uword i) { arma_debug_check( (i >= n_elem), "field::operator(): index out of bounds"); return (*mem[i]); } //! linear element accessor (treats the field as a vector); bounds checking not done when ARMA_NO_DEBUG is defined template<typename oT> arma_inline const oT& field<oT>::operator() (const uword i) const { arma_debug_check( (i >= n_elem), "field::operator(): index out of bounds"); return (*mem[i]); } //! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined template<typename oT> arma_inline oT& field<oT>::operator() (const uword in_row, const uword in_col) { arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), "field::operator(): index out of bounds"); return (*mem[in_row + in_col*n_rows]); } //! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined template<typename oT> arma_inline const oT& field<oT>::operator() (const uword in_row, const uword in_col) const { arma_debug_check( ((in_row >= n_rows) || (in_col >= n_cols)), "field::operator(): index out of bounds"); return (*mem[in_row + in_col*n_rows]); } //! element accessor; no bounds check template<typename oT> arma_inline oT& field<oT>::at(const uword in_row, const uword in_col) { return (*mem[in_row + in_col*n_rows]); } //! element accessor; no bounds check template<typename oT> arma_inline const oT& field<oT>::at(const uword in_row, const uword in_col) const { return (*mem[in_row + in_col*n_rows]); } template<typename oT> inline field_injector< field<oT> > field<oT>::operator<<(const oT& val) { return field_injector< field<oT> >(*this, val); } template<typename oT> inline field_injector< field<oT> > field<oT>::operator<<(const injector_end_of_row<>& x) { return field_injector< field<oT> >(*this, x); } //! creation of subview_field (row of a field) template<typename oT> inline subview_field<oT> field<oT>::row(const uword row_num) { arma_extra_debug_sigprint(); arma_debug_check( (row_num >= n_rows), "field::row(): row out of bounds" ); return subview_field<oT>(*this, row_num, 0, 1, n_cols); } //! creation of subview_field (row of a field) template<typename oT> inline const subview_field<oT> field<oT>::row(const uword row_num) const { arma_extra_debug_sigprint(); arma_debug_check( (row_num >= n_rows), "field::row(): row out of bounds" ); return subview_field<oT>(*this, row_num, 0, 1, n_cols); } //! creation of subview_field (column of a field) template<typename oT> inline subview_field<oT> field<oT>::col(const uword col_num) { arma_extra_debug_sigprint(); arma_debug_check( (col_num >= n_cols), "field::col(): out of bounds"); return subview_field<oT>(*this, 0, col_num, n_rows, 1); } //! creation of subview_field (column of a field) template<typename oT> inline const subview_field<oT> field<oT>::col(const uword col_num) const { arma_extra_debug_sigprint(); arma_debug_check( (col_num >= n_cols), "field::col(): out of bounds"); return subview_field<oT>(*this, 0, col_num, n_rows, 1); } //! creation of subview_field (subfield comprised of specified rows) template<typename oT> inline subview_field<oT> field<oT>::rows(const uword in_row1, const uword in_row2) { arma_extra_debug_sigprint(); arma_debug_check ( ( (in_row1 > in_row2) || (in_row2 >= n_rows) ), "field::rows(): indicies out of bounds or incorrectly used" ); const uword sub_n_rows = in_row2 - in_row1 + 1; return subview_field<oT>(*this, in_row1, 0, sub_n_rows, n_cols); } //! creation of subview_field (subfield comprised of specified rows) template<typename oT> inline const subview_field<oT> field<oT>::rows(const uword in_row1, const uword in_row2) const { arma_extra_debug_sigprint(); arma_debug_check ( ( (in_row1 > in_row2) || (in_row2 >= n_rows) ), "field::rows(): indicies out of bounds or incorrectly used" ); const uword sub_n_rows = in_row2 - in_row1 + 1; return subview_field<oT>(*this, in_row1, 0, sub_n_rows, n_cols); } //! creation of subview_field (subfield comprised of specified columns) template<typename oT> inline subview_field<oT> field<oT>::cols(const uword in_col1, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check ( ( (in_col1 > in_col2) || (in_col2 >= n_cols) ), "field::cols(): indicies out of bounds or incorrectly used" ); const uword sub_n_cols = in_col2 - in_col1 + 1; return subview_field<oT>(*this, 0, in_col1, n_rows, sub_n_cols); } //! creation of subview_field (subfield comprised of specified columns) template<typename oT> inline const subview_field<oT> field<oT>::cols(const uword in_col1, const uword in_col2) const { arma_extra_debug_sigprint(); arma_debug_check ( ( (in_col1 > in_col2) || (in_col2 >= n_cols) ), "field::cols(): indicies out of bounds or incorrectly used" ); const uword sub_n_cols = in_col2 - in_col1 + 1; return subview_field<oT>(*this, 0, in_col1, n_rows, sub_n_cols); } //! creation of subview_field (subfield with arbitrary dimensions) template<typename oT> inline subview_field<oT> field<oT>::subfield(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check ( (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols), "field::subfield(): indices out of bounds or incorrectly used" ); const uword sub_n_rows = in_row2 - in_row1 + 1; const uword sub_n_cols = in_col2 - in_col1 + 1; return subview_field<oT>(*this, in_row1, in_col1, sub_n_rows, sub_n_cols); } //! creation of subview_field (subfield with arbitrary dimensions) template<typename oT> inline const subview_field<oT> field<oT>::subfield(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const { arma_extra_debug_sigprint(); arma_debug_check ( (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols), "field::subfield(): indices out of bounds or incorrectly used" ); const uword sub_n_rows = in_row2 - in_row1 + 1; const uword sub_n_cols = in_col2 - in_col1 + 1; return subview_field<oT>(*this, in_row1, in_col1, sub_n_rows, sub_n_cols); } //! creation of subview_field (subfield with arbitrary dimensions) template<typename oT> inline subview_field<oT> field<oT>::subfield(const span& row_span, const span& col_span) { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const bool col_all = col_span.whole; const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword sub_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword sub_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; arma_debug_check ( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) , "field::subfield(): indices out of bounds or incorrectly used" ); return subview_field<oT>(*this, in_row1, in_col1, sub_n_rows, sub_n_cols); } //! creation of subview_field (subfield with arbitrary dimensions) template<typename oT> inline const subview_field<oT> field<oT>::subfield(const span& row_span, const span& col_span) const { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const bool col_all = col_span.whole; const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword sub_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword sub_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; arma_debug_check ( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) , "field::subfield(): indices out of bounds or incorrectly used" ); return subview_field<oT>(*this, in_row1, in_col1, sub_n_rows, sub_n_cols); } template<typename oT> inline subview_field<oT> field<oT>::operator()(const span& row_span, const span& col_span) { arma_extra_debug_sigprint(); return (*this).subfield(row_span, col_span); } template<typename oT> inline const subview_field<oT> field<oT>::operator()(const span& row_span, const span& col_span) const { arma_extra_debug_sigprint(); return (*this).subfield(row_span, col_span); } //! print contents of the field (to the cout stream), //! optionally preceding with a user specified line of text. //! the field class preserves the stream's flags //! but the associated operator<< function for type oT //! may still modify the stream's parameters. //! NOTE: this function assumes that type oT can be printed, //! i.e. the function "std::ostream& operator<< (std::ostream&, const oT&)" //! has been defined. template<typename oT> inline void field<oT>::print(const std::string extra_text) const { arma_extra_debug_sigprint(); if(extra_text.length() != 0) { const std::streamsize orig_width = ARMA_DEFAULT_OSTREAM.width(); ARMA_DEFAULT_OSTREAM << extra_text << '\n'; ARMA_DEFAULT_OSTREAM.width(orig_width); } arma_ostream::print(ARMA_DEFAULT_OSTREAM, *this); } //! print contents of the field to a user specified stream, //! optionally preceding with a user specified line of text. //! the field class preserves the stream's flags //! but the associated operator<< function for type oT //! may still modify the stream's parameters. //! NOTE: this function assumes that type oT can be printed, //! i.e. the function "std::ostream& operator<< (std::ostream&, const oT&)" //! has been defined. template<typename oT> inline void field<oT>::print(std::ostream& user_stream, const std::string extra_text) const { arma_extra_debug_sigprint(); if(extra_text.length() != 0) { const std::streamsize orig_width = user_stream.width(); user_stream << extra_text << '\n'; user_stream.width(orig_width); } arma_ostream::print(user_stream, *this); } //! fill the field with an object template<typename oT> inline void field<oT>::fill(const oT& x) { arma_extra_debug_sigprint(); field<oT>& t = *this; for(uword i=0; i<n_elem; ++i) { t[i] = x; } } //! reset the field to an empty state (i.e. the field will have no objects) template<typename oT> inline void field<oT>::reset() { arma_extra_debug_sigprint(); init(0,0); } //! reset each object template<typename oT> inline void field<oT>::reset_objects() { arma_extra_debug_sigprint(); field_aux::reset_objects(*this); } //! returns true if the field has no objects template<typename oT> arma_inline bool field<oT>::is_empty() const { return (n_elem == 0); } //! returns true if the given index is currently in range template<typename oT> arma_inline arma_warn_unused bool field<oT>::in_range(const uword i) const { return (i < n_elem); } //! returns true if the given start and end indices are currently in range template<typename oT> arma_inline arma_warn_unused bool field<oT>::in_range(const span& x) const { arma_extra_debug_sigprint(); if(x.whole == true) { return true; } else { const uword a = x.a; const uword b = x.b; return ( (a <= b) && (b < n_elem) ); } } //! returns true if the given location is currently in range template<typename oT> arma_inline arma_warn_unused bool field<oT>::in_range(const uword in_row, const uword in_col) const { return ( (in_row < n_rows) && (in_col < n_cols) ); } template<typename oT> arma_inline arma_warn_unused bool field<oT>::in_range(const span& row_span, const uword in_col) const { arma_extra_debug_sigprint(); if(row_span.whole == true) { return (in_col < n_cols); } else { const uword in_row1 = row_span.a; const uword in_row2 = row_span.b; return ( (in_row1 <= in_row2) && (in_row2 < n_rows) && (in_col < n_cols) ); } } template<typename oT> arma_inline arma_warn_unused bool field<oT>::in_range(const uword in_row, const span& col_span) const { arma_extra_debug_sigprint(); if(col_span.whole == true) { return (in_row < n_rows); } else { const uword in_col1 = col_span.a; const uword in_col2 = col_span.b; return ( (in_row < n_rows) && (in_col1 <= in_col2) && (in_col2 < n_cols) ); } } template<typename oT> arma_inline arma_warn_unused bool field<oT>::in_range(const span& row_span, const span& col_span) const { arma_extra_debug_sigprint(); const uword in_row1 = row_span.a; const uword in_row2 = row_span.b; const uword in_col1 = col_span.a; const uword in_col2 = col_span.b; const bool rows_ok = row_span.whole ? true : ( (in_row1 <= in_row2) && (in_row2 < n_rows) ); const bool cols_ok = col_span.whole ? true : ( (in_col1 <= in_col2) && (in_col2 < n_cols) ); return ( (rows_ok == true) && (cols_ok == true) ); } template<typename oT> inline bool field<oT>::save(const std::string name, const file_type type, const bool print_status) const { arma_extra_debug_sigprint(); std::string err_msg; const bool save_okay = field_aux::save(*this, name, type, err_msg); if( (print_status == true) && (save_okay == false) ) { if(err_msg.length() > 0) { arma_warn(true, "field::save(): ", err_msg, name); } else { arma_warn(true, "field::save(): couldn't write to ", name); } } return save_okay; } template<typename oT> inline bool field<oT>::save(std::ostream& os, const file_type type, const bool print_status) const { arma_extra_debug_sigprint(); std::string err_msg; const bool save_okay = field_aux::save(*this, os, type, err_msg); if( (print_status == true) && (save_okay == false) ) { if(err_msg.length() > 0) { arma_warn(true, "field::save(): ", err_msg, "[ostream]"); } else { arma_warn(true, "field::save(): couldn't write to [ostream]"); } } return save_okay; } template<typename oT> inline bool field<oT>::load(const std::string name, const file_type type, const bool print_status) { arma_extra_debug_sigprint(); std::string err_msg; const bool load_okay = field_aux::load(*this, name, type, err_msg); if( (print_status == true) && (load_okay == false) ) { if(err_msg.length() > 0) { arma_warn(true, "field::load(): ", err_msg, name); } else { arma_warn(true, "field::load(): couldn't read from ", name); } } if(load_okay == false) { (*this).reset(); } return load_okay; } template<typename oT> inline bool field<oT>::load(std::istream& is, const file_type type, const bool print_status) { arma_extra_debug_sigprint(); std::string err_msg; const bool load_okay = field_aux::load(*this, is, type, err_msg); if( (print_status == true) && (load_okay == false) ) { if(err_msg.length() > 0) { arma_warn(true, "field::load(): ", err_msg, "[istream]"); } else { arma_warn(true, "field::load(): couldn't read from [istream]"); } } if(load_okay == false) { (*this).reset(); } return load_okay; } template<typename oT> inline bool field<oT>::quiet_save(const std::string name, const file_type type) const { arma_extra_debug_sigprint(); return (*this).save(name, type, false); } template<typename oT> inline bool field<oT>::quiet_save(std::ostream& os, const file_type type) const { arma_extra_debug_sigprint(); return (*this).save(os, type, false); } template<typename oT> inline bool field<oT>::quiet_load(const std::string name, const file_type type) { arma_extra_debug_sigprint(); return (*this).load(name, type, false); } template<typename oT> inline bool field<oT>::quiet_load(std::istream& is, const file_type type) { arma_extra_debug_sigprint(); return (*this).load(is, type, false); } //! construct a field from a given field template<typename oT> inline void field<oT>::init(const field<oT>& x) { arma_extra_debug_sigprint(); if(this != &x) { const uword x_n_rows = x.n_rows; const uword x_n_cols = x.n_cols; init(x_n_rows, x_n_cols); field& t = *this; for(uword ucol=0; ucol < x_n_cols; ++ucol) for(uword urow=0; urow < x_n_rows; ++urow) { t.at(urow,ucol) = x.at(urow,ucol); } } } //! internal field construction; if the requested size is small enough, memory from the stack is used. otherwise memory is allocated via 'new' template<typename oT> inline void field<oT>::init(const uword n_rows_in, const uword n_cols_in) { arma_extra_debug_sigprint( arma_boost::format("n_rows_in = %d, n_cols_in = %d") % n_rows_in % n_cols_in ); arma_debug_check ( ( ( (n_rows_in > ARMA_MAX_UHWORD) || (n_cols_in > ARMA_MAX_UHWORD) ) ? ( (float(n_rows_in) * float(n_cols_in)) > float(ARMA_MAX_UWORD) ) : false ), "field::init(): requested size is too large" ); const uword n_elem_new = n_rows_in * n_cols_in; if(n_elem == n_elem_new) { // delete_objects(); // create_objects(); access::rw(n_rows) = n_rows_in; access::rw(n_cols) = n_cols_in; } else { delete_objects(); if(n_elem > sizeof(mem_local)/sizeof(oT*) ) { delete [] mem; } if(n_elem_new <= sizeof(mem_local)/sizeof(oT*) ) { mem = mem_local; } else { mem = new(std::nothrow) oT* [n_elem_new]; arma_check_bad_alloc( (mem == 0), "field::init(): out of memory" ); } access::rw(n_elem) = n_elem_new; if(n_elem_new == 0) { access::rw(n_rows) = 0; access::rw(n_cols) = 0; } else { access::rw(n_rows) = n_rows_in; access::rw(n_cols) = n_cols_in; } create_objects(); } } template<typename oT> inline void field<oT>::delete_objects() { arma_extra_debug_sigprint( arma_boost::format("n_elem = %d") % n_elem ); for(uword i=0; i<n_elem; ++i) { if(mem[i] != 0) { delete mem[i]; mem[i] = 0; } } } template<typename oT> inline void field<oT>::create_objects() { arma_extra_debug_sigprint( arma_boost::format("n_elem = %d") % n_elem ); for(uword i=0; i<n_elem; ++i) { mem[i] = new oT; } } template<typename oT> inline field<oT>::iterator::iterator(field<oT>& in_M, const bool at_end) : M(in_M) , i( (at_end == false) ? 0 : in_M.n_elem ) { arma_extra_debug_sigprint(); } template<typename oT> inline oT& field<oT>::iterator::operator*() { return M[i]; } template<typename oT> inline typename field<oT>::iterator& field<oT>::iterator::operator++() { ++i; return *this; } template<typename oT> inline void field<oT>::iterator::operator++(int) { operator++(); } template<typename oT> inline typename field<oT>::iterator& field<oT>::iterator::operator--() { if(i > 0) { --i; } return *this; } template<typename oT> inline void field<oT>::iterator::operator--(int) { operator--(); } template<typename oT> inline bool field<oT>::iterator::operator!=(const typename field<oT>::iterator& X) const { return (i != X.i); } template<typename oT> inline bool field<oT>::iterator::operator==(const typename field<oT>::iterator& X) const { return (i == X.i); } template<typename oT> inline field<oT>::const_iterator::const_iterator(const field<oT>& in_M, const bool at_end) : M(in_M) , i( (at_end == false) ? 0 : in_M.n_elem ) { arma_extra_debug_sigprint(); } template<typename oT> inline field<oT>::const_iterator::const_iterator(const typename field<oT>::iterator& X) : M(X.M) , i(X.i) { arma_extra_debug_sigprint(); } template<typename oT> inline const oT& field<oT>::const_iterator::operator*() const { return M[i]; } template<typename oT> inline typename field<oT>::const_iterator& field<oT>::const_iterator::operator++() { ++i; return *this; } template<typename oT> inline void field<oT>::const_iterator::operator++(int) { operator++(); } template<typename oT> inline typename field<oT>::const_iterator& field<oT>::const_iterator::operator--() { if(i > 0) { --i; } return *this; } template<typename oT> inline void field<oT>::const_iterator::operator--(int) { operator--(); } template<typename oT> inline bool field<oT>::const_iterator::operator!=(const typename field<oT>::const_iterator& X) const { return (i != X.i); } template<typename oT> inline bool field<oT>::const_iterator::operator==(const typename field<oT>::const_iterator& X) const { return (i == X.i); } template<typename oT> inline typename field<oT>::iterator field<oT>::begin() { arma_extra_debug_sigprint(); return field<oT>::iterator(*this); } template<typename oT> inline typename field<oT>::const_iterator field<oT>::begin() const { arma_extra_debug_sigprint(); return field<oT>::const_iterator(*this); } template<typename oT> inline typename field<oT>::const_iterator field<oT>::cbegin() const { arma_extra_debug_sigprint(); return field<oT>::const_iterator(*this); } template<typename oT> inline typename field<oT>::iterator field<oT>::end() { arma_extra_debug_sigprint(); return field<oT>::iterator(*this, true); } template<typename oT> inline typename field<oT>::const_iterator field<oT>::end() const { arma_extra_debug_sigprint(); return field<oT>::const_iterator(*this, true); } template<typename oT> inline typename field<oT>::const_iterator field<oT>::cend() const { arma_extra_debug_sigprint(); return field<oT>::const_iterator(*this, true); } template<typename oT> inline void field<oT>::clear() { reset(); } template<typename oT> inline bool field<oT>::empty() const { return (n_elem == 0); } template<typename oT> inline uword field<oT>::size() const { return n_elem; } // // // template<typename oT> inline void field_aux::reset_objects(field<oT>& x) { arma_extra_debug_sigprint(); x.delete_objects(); x.create_objects(); } template<typename eT> inline void field_aux::reset_objects(field< Mat<eT> >& x) { arma_extra_debug_sigprint(); for(uword i=0; i<x.n_elem; ++i) { (*(x.mem[i])).reset(); } } template<typename eT> inline void field_aux::reset_objects(field< Col<eT> >& x) { arma_extra_debug_sigprint(); for(uword i=0; i<x.n_elem; ++i) { (*(x.mem[i])).reset(); } } template<typename eT> inline void field_aux::reset_objects(field< Row<eT> >& x) { arma_extra_debug_sigprint(); for(uword i=0; i<x.n_elem; ++i) { (*(x.mem[i])).reset(); } } template<typename eT> inline void field_aux::reset_objects(field< Cube<eT> >& x) { arma_extra_debug_sigprint(); for(uword i=0; i<x.n_elem; ++i) { (*(x.mem[i])).reset(); } } inline void field_aux::reset_objects(field< std::string >& x) { arma_extra_debug_sigprint(); for(uword i=0; i<x.n_elem; ++i) { (*(x.mem[i])).clear(); } } // // // template<typename oT> inline bool field_aux::save(const field<oT>&, const std::string&, const file_type, std::string& err_msg) { arma_extra_debug_sigprint(); err_msg = " [sorry, saving/loading this type of field is currently not supported] filename = "; return false; } template<typename oT> inline bool field_aux::save(const field<oT>&, std::ostream&, const file_type, std::string& err_msg) { arma_extra_debug_sigprint(); err_msg = " [sorry, saving/loading this type of field is currently not supported] filename = "; return false; } template<typename oT> inline bool field_aux::load(field<oT>&, const std::string&, const file_type, std::string& err_msg) { arma_extra_debug_sigprint(); err_msg = " [sorry, saving/loading this type of field is currently not supported] filename = "; return false; } template<typename oT> inline bool field_aux::load(field<oT>&, std::istream&, const file_type, std::string& err_msg) { arma_extra_debug_sigprint(); err_msg = " [sorry, saving/loading this type of field is currently not supported] filename = "; return false; } template<typename eT> inline bool field_aux::save(const field< Mat<eT> >& x, const std::string& name, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case arma_binary: return diskio::save_arma_binary(x, name); break; case ppm_binary: return diskio::save_ppm_binary(x, name); break; default: err_msg = " [unsupported type] filename = "; return false; } } template<typename eT> inline bool field_aux::save(const field< Mat<eT> >& x, std::ostream& os, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case arma_binary: return diskio::save_arma_binary(x, os); break; case ppm_binary: return diskio::save_ppm_binary(x, os); break; default: err_msg = " [unsupported type] filename = "; return false; } } template<typename eT> inline bool field_aux::load(field< Mat<eT> >& x, const std::string& name, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case auto_detect: return diskio::load_auto_detect(x, name, err_msg); break; case arma_binary: return diskio::load_arma_binary(x, name, err_msg); break; case ppm_binary: return diskio::load_ppm_binary(x, name, err_msg); break; default: err_msg = " [unsupported type] filename = "; return false; } } template<typename eT> inline bool field_aux::load(field< Mat<eT> >& x, std::istream& is, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case auto_detect: return diskio::load_auto_detect(x, is, err_msg); break; case arma_binary: return diskio::load_arma_binary(x, is, err_msg); break; case ppm_binary: return diskio::load_ppm_binary(x, is, err_msg); break; default: err_msg = " [unsupported type] filename = "; return false; } } template<typename eT> inline bool field_aux::save(const field< Col<eT> >& x, const std::string& name, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case arma_binary: return diskio::save_arma_binary(x, name); break; case ppm_binary: return diskio::save_ppm_binary(x, name); break; default: err_msg = " [unsupported type] filename = "; return false; } } template<typename eT> inline bool field_aux::save(const field< Col<eT> >& x, std::ostream& os, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case arma_binary: return diskio::save_arma_binary(x, os); break; case ppm_binary: return diskio::save_ppm_binary(x, os); break; default: err_msg = " [unsupported type] filename = "; return false; } } template<typename eT> inline bool field_aux::load(field< Col<eT> >& x, const std::string& name, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case auto_detect: return diskio::load_auto_detect(x, name, err_msg); break; case arma_binary: return diskio::load_arma_binary(x, name, err_msg); break; case ppm_binary: return diskio::load_ppm_binary(x, name, err_msg); break; default: err_msg = " [unsupported type] filename = "; return false; } } template<typename eT> inline bool field_aux::load(field< Col<eT> >& x, std::istream& is, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case auto_detect: return diskio::load_auto_detect(x, is, err_msg); break; case arma_binary: return diskio::load_arma_binary(x, is, err_msg); break; case ppm_binary: return diskio::load_ppm_binary(x, is, err_msg); break; default: err_msg = " [unsupported type] filename = "; return false; } } template<typename eT> inline bool field_aux::save(const field< Row<eT> >& x, const std::string& name, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case arma_binary: return diskio::save_arma_binary(x, name, err_msg); break; case ppm_binary: return diskio::save_ppm_binary(x, name, err_msg); break; default: err_msg = " [unsupported type] filename = "; return false; } } template<typename eT> inline bool field_aux::save(const field< Row<eT> >& x, std::ostream& os, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case arma_binary: return diskio::save_arma_binary(x, os, err_msg); break; case ppm_binary: return diskio::save_ppm_binary(x, os, err_msg); break; default: err_msg = " [unsupported type] filename = "; return false; } } template<typename eT> inline bool field_aux::load(field< Row<eT> >& x, const std::string& name, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case auto_detect: return diskio::load_auto_detect(x, name, err_msg); break; case arma_binary: return diskio::load_arma_binary(x, name, err_msg); break; case ppm_binary: return diskio::load_ppm_binary(x, name, err_msg); break; default: err_msg = " [unsupported type] filename = "; return false; } } template<typename eT> inline bool field_aux::load(field< Row<eT> >& x, std::istream& is, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case auto_detect: return diskio::load_auto_detect(x, is, err_msg); break; case arma_binary: return diskio::load_arma_binary(x, is, err_msg); break; case ppm_binary: return diskio::load_ppm_binary(x, is, err_msg); break; default: err_msg = " [unsupported type] filename = "; return false; } } template<typename eT> inline bool field_aux::save(const field< Cube<eT> >& x, const std::string& name, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case arma_binary: return diskio::save_arma_binary(x, name, err_msg); break; case ppm_binary: return diskio::save_ppm_binary(x, name, err_msg); break; default: err_msg = " [unsupported type] filename = "; return false; } } template<typename eT> inline bool field_aux::save(const field< Cube<eT> >& x, std::ostream& os, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case arma_binary: return diskio::save_arma_binary(x, os, err_msg); break; case ppm_binary: return diskio::save_ppm_binary(x, os, err_msg); break; default: err_msg = " [unsupported type] filename = "; return false; } } template<typename eT> inline bool field_aux::load(field< Cube<eT> >& x, const std::string& name, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case auto_detect: return diskio::load_auto_detect(x, name, err_msg); break; case arma_binary: return diskio::load_arma_binary(x, name, err_msg); break; case ppm_binary: return diskio::load_ppm_binary(x, name, err_msg); break; default: err_msg = " [unsupported type] filename = "; return false; } } template<typename eT> inline bool field_aux::load(field< Cube<eT> >& x, std::istream& is, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case auto_detect: return diskio::load_auto_detect(x, is, err_msg); break; case arma_binary: return diskio::load_arma_binary(x, is, err_msg); break; case ppm_binary: return diskio::load_ppm_binary(x, is, err_msg); break; default: err_msg = " [unsupported type] filename = "; return false; } } inline bool field_aux::save(const field< std::string >& x, const std::string& name, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); arma_ignore(type); err_msg.clear(); return diskio::save_std_string(x, name); } inline bool field_aux::save(const field< std::string >& x, std::ostream& os, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); arma_ignore(type); err_msg.clear(); return diskio::save_std_string(x, os); } inline bool field_aux::load(field< std::string >& x, const std::string& name, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); arma_ignore(type); return diskio::load_std_string(x, name, err_msg); } inline bool field_aux::load(field< std::string >& x, std::istream& is, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); arma_ignore(type); return diskio::load_std_string(x, is, err_msg); } #ifdef ARMA_EXTRA_FIELD_MEAT #include ARMA_INCFILE_WRAP(ARMA_EXTRA_FIELD_MEAT) #endif //! @}