Program Listing for File ListMap.hpp

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

/*
 * ListMap.hpp
 *
 *  @date 27.07.2017
 */

#ifndef LVR2_ATTRMAPS_LISTMAP_H_
#define LVR2_ATTRMAPS_LISTMAP_H_

#include <utility>
#include <vector>

#include "lvr2/attrmaps/AttributeMap.hpp"

using std::vector;
using std::pair;

namespace lvr2
{


template<typename HandleT, typename ValueT>
class ListMap : public AttributeMap<HandleT, ValueT>
{
public:
    ListMap() {}

    ListMap(const ValueT& defaultValue);

    ListMap(size_t countElements, const ValueT& defaultValue);

    // =======================================================================
    // Implemented methods from the interface (check interface for docs)
    // =======================================================================
    bool containsKey(HandleT key) const final;
    boost::optional<ValueT> insert(HandleT key, const ValueT& value) final;
    boost::optional<ValueT> erase(HandleT key) final;
    void clear() final;
    boost::optional<ValueT&> get(HandleT key) final;
    boost::optional<const ValueT&> get(HandleT key) const final;
    size_t numValues() const final;

    AttributeMapHandleIteratorPtr<HandleT> begin() const final;
    AttributeMapHandleIteratorPtr<HandleT> end() const final;

    void reserve(size_t newCap);

private:
    vector<pair<HandleT, ValueT>> m_list;
    boost::optional<ValueT> m_default;

    // Internal helper method
    typename std::vector<pair<HandleT, ValueT>>::const_iterator keyIterator(HandleT key) const;
    typename std::vector<pair<HandleT, ValueT>>::iterator keyIterator(HandleT key);

    template<typename, typename> friend class ListMap;
};

template<typename HandleT, typename ValueT>
class ListMapIterator : public AttributeMapHandleIterator<HandleT>
{
public:
    ListMapIterator(typename vector<pair<HandleT, ValueT>>::const_iterator iter);

    AttributeMapHandleIterator<HandleT>& operator++() final;
    bool operator==(const AttributeMapHandleIterator<HandleT>& other) const final;
    bool operator!=(const AttributeMapHandleIterator<HandleT>& other) const final;
    HandleT operator*() const final;
    std::unique_ptr<AttributeMapHandleIterator<HandleT>> clone() const final;

private:
    typename vector<pair<HandleT, ValueT>>::const_iterator m_iter;
};

} // namespace lvr2

#include "lvr2/attrmaps/ListMap.tcc"

#endif /* LVR2_ATTRMAPS_LISTMAP_H_ */