/*! * Copyright (c) 2019 by Contributors * \file dgl/lazy.h * \brief Lazy object that will be materialized only when being queried. */ #ifndef DGL_LAZY_H_ #define DGL_LAZY_H_ #include namespace dgl { /*! * \brief Lazy object that will be materialized only when being queried. * * The object should be immutable -- no mutation once materialized. * The object is currently not threaad safe. */ template class Lazy { public: /*!\brief default constructor to construct a lazy object */ Lazy() {} /*!\brief constructor to construct an object with given value (non-lazy case) */ explicit Lazy(const T& val): ptr_(new T(val)) {} /*!\brief destructor */ ~Lazy() = default; /*! * \brief Get the value of this object. If the object has not been instantiated, * using the provided function to create it. * \param fn The creator function. * \return the object value. */ template const T& Get(Fn fn) { if (!ptr_) { ptr_.reset(new T(fn())); } return *ptr_; } private: /*!\brief the internal data pointer */ std::shared_ptr ptr_{nullptr}; }; } // namespace dgl #endif // DGL_LAZY_H_