// SPDX-License-Identifier: Apache-2.0 // // 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 constexpr fill_class() {} }; static constexpr fill_class none; static constexpr fill_class zeros; static constexpr fill_class ones; static constexpr fill_class eye; static constexpr fill_class randu; static constexpr 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 inline bool isfinite_wrapper(eT ) { return true; } template<> inline bool isfinite_wrapper(float x) { return std::isfinite(x); } template<> inline bool isfinite_wrapper(double x) { return std::isfinite(x); } template inline bool isfinite_wrapper(std::complex& x) { return std::isfinite(x.real()) && std::isfinite(x.imag()); } // 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() const { const bool ok_conversion = (std::is_integral::value && std::is_floating_point::value) ? isfinite_wrapper(scalar) : true; return scalar_holder( ok_conversion ? scalar_type2(scalar) : scalar_type2(0) ); } }; // template inline typename enable_if2< is_supported_elem_type::value, scalar_holder >::result value(const scalar_type& in_scalar) { return scalar_holder(in_scalar); } } //! @}