Program Listing for File LazyLoadResource.h

Return to documentation for file (include/mola_kernel/LazyLoadResource.h)

/* -------------------------------------------------------------------------
 *   A Modular Optimization framework for Localization and mApping  (MOLA)
 * Copyright (C) 2018-2024 Jose Luis Blanco, University of Almeria
 * See LICENSE for license information.
 * ------------------------------------------------------------------------- */
#pragma once

#include <mola_kernel/id.h>
#include <mrpt/serialization/CSerializable.h>

#include <string>

namespace mola
{
class LazyLoadResource
{
   public:
    LazyLoadResource() = default;

    LazyLoadResource(
        const mrpt::serialization::CSerializable::Ptr& source,
        const std::string&                             f)
        : data_(source), external_filename_(f)
    {
    }

    const std::string& externalStorage() const { return external_filename_; }

    mrpt::serialization::CSerializable::Ptr value()
    {
        internalLoadProxy();
        return data_;
    }
    const mrpt::serialization::CSerializable::Ptr& value() const
    {
        internalLoadProxy();
        return data_;
    }

    void load() const;

    void unload() const;
    bool isUnloaded() const;

    void reset() { *this = LazyLoadResource(); }

    void set(
        const mrpt::serialization::CSerializable::Ptr& source,
        const std::string&                             f);

    void setAsExternal(const std::string& relativeFileName);

    void setParentEntityID(const mola::id_t id) { parent_entity_id_ = id; }

    static std::string EXTERNAL_BASE_DIR;

   private:
    inline void internalLoadProxy() const
    {
        if (data_) return;
        load();
    }

    const std::string& buildAbsoluteFilePath() const;

    mutable mrpt::serialization::CSerializable::Ptr data_;

    std::string         external_filename_;
    mola::id_t          parent_entity_id_{INVALID_ID};
    mutable std::string cached_abs_fil_;
    mutable bool        cached_file_ok_{false};
};
}  // namespace mola