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