Program Listing for File LazyMesh.hpp

Return to documentation for file (include/lvr2/geometry/LazyMesh.hpp)

#pragma once

#include "lvr2/geometry/PMPMesh.hpp"
#include "lvr2/util/Hdf5Util.hpp"

#include <memory>

namespace lvr2
{

constexpr const char* LAZY_MESH_TEMP_DIR = "/temp_lazy_meshes";

template<typename BaseVecT>
class LazyMesh
{
public:
    LazyMesh(PMPMesh<BaseVecT>&& src, std::shared_ptr<HighFive::File> file, bool keepLoaded = false);

    LazyMesh(LazyMesh&&);
    LazyMesh& operator=(LazyMesh&&);

    virtual ~LazyMesh();

    std::shared_ptr<const PMPMesh<BaseVecT>> get();

    std::shared_ptr<PMPMesh<BaseVecT>> modify();

    bool isLoaded() const
    {
        return !m_weakPtr.expired();
    }

    void keepLoaded()
    {
        m_keepLoadedHelper = getInternal();
    }

    bool isKeptLoaded() const
    {
        return m_keepLoadedHelper != nullptr;
    }

    void allowUnload()
    {
        m_keepLoadedHelper.reset();
    }

    size_t numFaces() const
    {
        return m_mesh->numFaces();
    }
    size_t numVertices() const
    {
        return m_mesh->numVertices();
    }
    size_t numEdges() const
    {
        return m_mesh->numEdges();
    }

    std::shared_ptr<HighFive::File> getFile() const
    {
        return m_file;
    }

    static void removeTempDir(std::shared_ptr<HighFive::File> file)
    {
        file->getGroup("/").unlink(LAZY_MESH_TEMP_DIR + 1); // +1 to skip the leading '/'
    }
private:
    // delete unwanted constructors/assignments
    LazyMesh() = delete;
    LazyMesh(const LazyMesh&) = delete;
    LazyMesh& operator=(const LazyMesh&) = delete;

    std::shared_ptr<PMPMesh<BaseVecT>> getInternal();
    void unload();

    PMPMesh<BaseVecT>* m_mesh;
    std::weak_ptr<PMPMesh<BaseVecT>> m_weakPtr;
    std::shared_ptr<PMPMesh<BaseVecT>> m_keepLoadedHelper;
    bool m_modified = false;
    std::unique_ptr<HighFive::Group> m_source;
    std::string m_groupName;
    std::shared_ptr<HighFive::File> m_file;

    struct Unloader
    {
        Unloader(LazyMesh* owner) : m_owner(owner) {}

        void operator()(PMPMesh<BaseVecT>* mesh);

        LazyMesh* m_owner;
    };
};

} // namespace lvr2

#include "lvr2/geometry/LazyMesh.tcc"