Program Listing for File value_ptr.hpp

Return to documentation for file (include/eat/framework/value_ptr.hpp)

#pragma once
#include <memory>

namespace eat::framework {

template <typename T>
std::shared_ptr<T> copy_shared_ptr(const std::shared_ptr<T> &value) {
  return std::make_shared<T>(*value);
}

template <typename T>
class ValuePtr {
 public:
  ValuePtr() {}
  ValuePtr(std::shared_ptr<T> value_) : value(std::move(value_)) {}

  std::shared_ptr<const T> read() const { return value; }

  std::shared_ptr<T> move_or_copy() const {
    if (value.use_count() > 1)
      return copy_shared_ptr(value);
    else
      return std::move(value);
  }

 private:
  std::shared_ptr<T> value;
};

}  // namespace eat::framework