diff --git a/include/armadillo b/include/armadillo index edfc790c..2a2f8552 100644 --- a/include/armadillo +++ b/include/armadillo @@ -101,6 +101,7 @@ namespace arma #include "armadillo_bits/constants_old.hpp" #include "armadillo_bits/mp_misc.hpp" #include "armadillo_bits/arma_rel_comparators.hpp" + #include "armadillo_bits/fill.hpp" #ifdef ARMA_RNG_ALT #include ARMA_INCFILE_WRAP(ARMA_RNG_ALT) diff --git a/include/armadillo_bits/Mat_bones.hpp b/include/armadillo_bits/Mat_bones.hpp index fa2649ff..8847af34 100644 --- a/include/armadillo_bits/Mat_bones.hpp +++ b/include/armadillo_bits/Mat_bones.hpp @@ -67,6 +67,9 @@ class Mat : public Base< eT, Mat > template inline Mat(const uword in_rows, const uword in_cols, const fill::fill_class& f); template inline Mat(const SizeMat& s, const fill::fill_class& f); + inline Mat(const uword in_rows, const uword in_cols, const fill::scalar_holder f); + inline Mat(const SizeMat& s, const fill::scalar_holder f); + inline arma_cold Mat(const char* text); inline arma_cold Mat& operator=(const char* text); diff --git a/include/armadillo_bits/Mat_meat.hpp b/include/armadillo_bits/Mat_meat.hpp index 8b3ffb0c..e1d1742c 100644 --- a/include/armadillo_bits/Mat_meat.hpp +++ b/include/armadillo_bits/Mat_meat.hpp @@ -200,6 +200,47 @@ Mat::Mat(const SizeMat& s, const fill::fill_class& f) +//! construct the matrix to have user specified dimensions and fill with specified value +template +inline +Mat::Mat(const uword in_n_rows, const uword in_n_cols, const fill::scalar_holder f) + : n_rows(in_n_rows) + , n_cols(in_n_cols) + , n_elem(in_n_rows*in_n_cols) + , n_alloc() + , vec_state(0) + , mem_state(0) + , mem() + { + arma_extra_debug_sigprint_this(this); + + init_cold(); + + (*this).fill(f.scalar); + } + + + +template +inline +Mat::Mat(const SizeMat& s, const fill::scalar_holder f) + : n_rows(s.n_rows) + , n_cols(s.n_cols) + , n_elem(s.n_rows*s.n_cols) + , n_alloc() + , vec_state(0) + , mem_state(0) + , mem() + { + arma_extra_debug_sigprint_this(this); + + init_cold(); + + (*this).fill(f.scalar); + } + + + //! constructor used by Row and Col classes template inline @@ -6909,7 +6950,7 @@ Mat::fill(const eT val) -//! fill the matrix with the specified value +//! fill the matrix with the specified pattern template template inline diff --git a/include/armadillo_bits/arma_forward.hpp b/include/armadillo_bits/arma_forward.hpp index 5c79e132..b79d485d 100644 --- a/include/armadillo_bits/arma_forward.hpp +++ b/include/armadillo_bits/arma_forward.hpp @@ -394,33 +394,6 @@ struct csv_name; -//! \addtogroup fill -//! @{ - -namespace fill - { - struct fill_none {}; - struct fill_zeros {}; - struct fill_ones {}; - struct fill_eye {}; - struct fill_randu {}; - struct fill_randn {}; - - template - struct fill_class { inline fill_class() {} }; - - static const fill_class none; - static const fill_class zeros; - static const fill_class ones; - static const fill_class eye; - static const fill_class randu; - static const fill_class randn; - } - -//! @} - - - //! \addtogroup fn_spsolve //! @{ diff --git a/include/armadillo_bits/fill.hpp b/include/armadillo_bits/fill.hpp new file mode 100644 index 00000000..50b9f500 --- /dev/null +++ b/include/armadillo_bits/fill.hpp @@ -0,0 +1,105 @@ +// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) +// Copyright 2008-2016 National ICT Australia (NICTA) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + + +//! \addtogroup fill +//! @{ + + +namespace fill + { + struct fill_none {}; + struct fill_zeros {}; + struct fill_ones {}; + struct fill_eye {}; + struct fill_randu {}; + struct fill_randn {}; + + template + struct fill_class { inline fill_class() {} }; + + static const fill_class none; + static const fill_class zeros; + static const fill_class ones; + static const fill_class eye; + static const fill_class randu; + static const fill_class randn; + + // + + template + struct allow_conversion + { + static constexpr bool value = true; + }; + + template<> struct allow_conversion, double> { static constexpr bool value = false; }; + template<> struct allow_conversion, float > { static constexpr bool value = false; }; + template<> struct allow_conversion, u64 > { static constexpr bool value = false; }; + template<> struct allow_conversion, s64 > { static constexpr bool value = false; }; + template<> struct allow_conversion, u32 > { static constexpr bool value = false; }; + template<> struct allow_conversion, s32 > { static constexpr bool value = false; }; + template<> struct allow_conversion, u16 > { static constexpr bool value = false; }; + template<> struct allow_conversion, s16 > { static constexpr bool value = false; }; + template<> struct allow_conversion, u8 > { static constexpr bool value = false; }; + template<> struct allow_conversion, s8 > { static constexpr bool value = false; }; + + template<> struct allow_conversion, double> { static constexpr bool value = false; }; + template<> struct allow_conversion, float > { static constexpr bool value = false; }; + template<> struct allow_conversion, u64 > { static constexpr bool value = false; }; + template<> struct allow_conversion, s64 > { static constexpr bool value = false; }; + template<> struct allow_conversion, u32 > { static constexpr bool value = false; }; + template<> struct allow_conversion, s32 > { static constexpr bool value = false; }; + template<> struct allow_conversion, u16 > { static constexpr bool value = false; }; + template<> struct allow_conversion, s16 > { static constexpr bool value = false; }; + template<> struct allow_conversion, u8 > { static constexpr bool value = false; }; + template<> struct allow_conversion, s8 > { static constexpr bool value = false; }; + + // + + template + struct scalar_holder + { + const scalar_type1 scalar; + + inline explicit scalar_holder(const scalar_type1& in_scalar) : scalar(in_scalar) {} + + inline scalar_holder() = delete; + + template + < + typename scalar_type2, + typename arma::enable_if2::value, int>::result = 0 + > + inline + operator scalar_holder() + { + return scalar_holder( scalar_type2(scalar) ); + } + }; + + // + + template + inline + typename enable_if2< is_supported_elem_type::value, scalar_holder >::result + value(const scalar_type& in_scalar) + { + return scalar_holder(in_scalar); + } + } + + +//! @}