Program Listing for File HashMap.hpp

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

/*
 * HashMap.hpp
 *
 *  @date 27.07.2017
 */

#ifndef LVR2_ATTRMAPS_HASHMAP_H_
#define LVR2_ATTRMAPS_HASHMAP_H_

#include <unordered_map>

#include "lvr2/attrmaps/AttributeMap.hpp"

using std::unordered_map;

namespace lvr2
{

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

    HashMap(const ValueT& defaultValue);

    HashMap(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:
    unordered_map<HandleT, ValueT> m_map;
    boost::optional<ValueT> m_default;
};

template<typename HandleT, typename ValueT>
class HashMapIterator : public AttributeMapHandleIterator<HandleT>
{
public:
    HashMapIterator(typename unordered_map<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 unordered_map<HandleT, ValueT>::const_iterator m_iter;
};

} // namespace lvr2

#include "lvr2/attrmaps/HashMap.tcc"

#endif /* LVR2_ATTRMAPS_HASHMAP_H_ */