// This file is part of Eigen, a lightweight C++ template library // for linear algebra. // // Copyright (C) 2020 Sebastien Boisvert // // 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/. #ifndef EIGEN_MISC_MOVABLE_SCALAR_H #define EIGEN_MISC_MOVABLE_SCALAR_H #include namespace Eigen { template > struct MovableScalar : public Base { MovableScalar() = default; ~MovableScalar() = default; MovableScalar(const MovableScalar&) = default; MovableScalar(MovableScalar&& other) = default; MovableScalar& operator=(const MovableScalar&) = default; MovableScalar& operator=(MovableScalar&& other) = default; MovableScalar(Scalar scalar) : Base(100, scalar) {} operator Scalar() const { return this->size() > 0 ? this->back() : Scalar(); } }; template <> struct NumTraits> : GenericNumTraits {}; namespace internal { template struct random_impl> { using MoveableT = MovableScalar; using Impl = random_impl; static EIGEN_DEVICE_FUNC inline MoveableT run(const MoveableT& x, const MoveableT& y) { T result = Impl::run(x, y); return MoveableT(result); } static EIGEN_DEVICE_FUNC inline MoveableT run() { T result = Impl::run(); return MoveableT(result); } }; } // namespace internal } // namespace Eigen #endif