1*bf2c3715SXin Li // This file is part of Eigen, a lightweight C++ template library 2*bf2c3715SXin Li // for linear algebra. 3*bf2c3715SXin Li // 4*bf2c3715SXin Li // Copyright (C) 2020 Sebastien Boisvert <[email protected]> 5*bf2c3715SXin Li // 6*bf2c3715SXin Li // This Source Code Form is subject to the terms of the Mozilla 7*bf2c3715SXin Li // Public License v. 2.0. If a copy of the MPL was not distributed 8*bf2c3715SXin Li // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9*bf2c3715SXin Li 10*bf2c3715SXin Li #ifndef EIGEN_MISC_MOVABLE_SCALAR_H 11*bf2c3715SXin Li #define EIGEN_MISC_MOVABLE_SCALAR_H 12*bf2c3715SXin Li 13*bf2c3715SXin Li #include <vector> 14*bf2c3715SXin Li 15*bf2c3715SXin Li namespace Eigen 16*bf2c3715SXin Li { 17*bf2c3715SXin Li template <typename Scalar, typename Base = std::vector<Scalar>> 18*bf2c3715SXin Li struct MovableScalar : public Base 19*bf2c3715SXin Li { 20*bf2c3715SXin Li MovableScalar() = default; 21*bf2c3715SXin Li ~MovableScalar() = default; 22*bf2c3715SXin Li MovableScalar(const MovableScalar&) = default; 23*bf2c3715SXin Li MovableScalar(MovableScalar&& other) = default; 24*bf2c3715SXin Li MovableScalar& operator=(const MovableScalar&) = default; 25*bf2c3715SXin Li MovableScalar& operator=(MovableScalar&& other) = default; MovableScalarMovableScalar26*bf2c3715SXin Li MovableScalar(Scalar scalar) : Base(100, scalar) {} 27*bf2c3715SXin Li ScalarMovableScalar28*bf2c3715SXin Li operator Scalar() const { return this->size() > 0 ? this->back() : Scalar(); } 29*bf2c3715SXin Li }; 30*bf2c3715SXin Li 31*bf2c3715SXin Li template<> struct NumTraits<MovableScalar<float>> : GenericNumTraits<float> {}; 32*bf2c3715SXin Li } 33*bf2c3715SXin Li 34*bf2c3715SXin Li #endif 35*bf2c3715SXin Li 36