Program Listing for File AttributeMap.hpp

Return to documentation for file (include/lvr2/attrmaps/AttributeMap.hpp)

/*
 * AttributeMap.hpp
 *
 *  @date 26.07.2017
 */

#ifndef LVR2_ATTRMAPS_ATTRIBUTEMAP_H_
#define LVR2_ATTRMAPS_ATTRIBUTEMAP_H_

#include <boost/optional.hpp>
#include <memory>

#include "lvr2/geometry/Handles.hpp"

namespace lvr2
{

// Forward declarations
template<typename> class AttributeMapHandleIteratorPtr;

template<typename HandleT, typename ValueT>
class AttributeMap
{
    static_assert(
        std::is_base_of<BaseHandle, HandleT>::value,
        "HandleT must inherit from BaseHandle!"
    );

public:
    typedef HandleT HandleType;

    typedef ValueT ValueType;

    virtual bool containsKey(HandleT key) const = 0;

    virtual boost::optional<ValueT> insert(HandleT key, const ValueT& value) = 0;

    virtual boost::optional<ValueT> erase(HandleT key) = 0;

    virtual void clear() = 0;

    virtual boost::optional<ValueT&> get(HandleT key) = 0;

    virtual boost::optional<const ValueT&> get(HandleT key) const = 0;

    virtual size_t numValues() const = 0;

    virtual AttributeMapHandleIteratorPtr<HandleT> begin() const = 0;

    virtual AttributeMapHandleIteratorPtr<HandleT> end() const = 0;

    ValueT& operator[](HandleT key);

    const ValueT& operator[](HandleT key) const;
};


template<typename HandleT>
class AttributeMapHandleIterator
{
    static_assert(
        std::is_base_of<BaseHandle, HandleT>::value,
        "HandleT must inherit from BaseHandle!"
    );

public:
    virtual AttributeMapHandleIterator& operator++() = 0;
    virtual bool operator==(const AttributeMapHandleIterator& other) const = 0;
    virtual bool operator!=(const AttributeMapHandleIterator& other) const = 0;

    virtual HandleT operator*() const = 0;
    virtual std::unique_ptr<AttributeMapHandleIterator> clone() const = 0;

    virtual ~AttributeMapHandleIterator() = default;
};

template<typename HandleT>
class AttributeMapHandleIteratorPtr
{
    static_assert(
        std::is_base_of<BaseHandle, HandleT>::value,
        "HandleT must inherit from BaseHandle!"
    );

public:
    AttributeMapHandleIteratorPtr(std::unique_ptr<AttributeMapHandleIterator<HandleT>> iter)
        : m_iter(std::move(iter)) {}
    AttributeMapHandleIteratorPtr(const AttributeMapHandleIteratorPtr& iteratorPtr)
        : m_iter(iteratorPtr.m_iter->clone()) {}

    AttributeMapHandleIteratorPtr& operator++();
    bool operator==(const AttributeMapHandleIteratorPtr& other) const;
    bool operator!=(const AttributeMapHandleIteratorPtr& other) const;
    HandleT operator*() const;

    virtual ~AttributeMapHandleIteratorPtr() = default;

private:
    std::unique_ptr<AttributeMapHandleIterator<HandleT>> m_iter;
};

} // namespace lvr2

#include "lvr2/attrmaps/AttributeMap.tcc"

#endif /* LVR2_ATTRMAPS_ATTRIBUTEMAP_H_ */