// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2020 Sebastien Boisvert <seb@boisvert.info>
//
// 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 <vector>

namespace Eigen {
template <typename Scalar, typename Base = std::vector<Scalar>>
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<MovableScalar<float>> : GenericNumTraits<float> {};

namespace internal {
template <typename T>
struct random_impl<MovableScalar<T>> {
  using MoveableT = MovableScalar<T>;
  using Impl = random_impl<T>;
  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
