Documented the CC Map class

This commit is contained in:
Paul Ferrand 2019-11-30 00:52:02 +01:00
parent 78cbe5d81b
commit fd60ef4319

View file

@ -26,10 +26,23 @@
#include <map> #include <map>
namespace sfz { namespace sfz {
/**
* @brief A simple map that holds ValueType elements at different indices, and can return a default one
* if not present. Used mostly for CC modifiers in region descriptions as to store only the CC modifiers
* that are specified in the SFZ file rather than a gazillion of dummy "disabled" modifiers. The default
* value is set on construction.
*
* @tparam ValueType The type held in the map
*/
template <class ValueType> template <class ValueType>
class CCMap { class CCMap {
public: public:
CCMap() = delete; CCMap() = delete;
/**
* @brief Construct a new CCMap object with the specified default value.
*
* @param defaultValue
*/
CCMap(const ValueType& defaultValue) CCMap(const ValueType& defaultValue)
: defaultValue(defaultValue) : defaultValue(defaultValue)
{ {
@ -38,6 +51,12 @@ public:
CCMap(const CCMap&) = default; CCMap(const CCMap&) = default;
~CCMap() = default; ~CCMap() = default;
/**
* @brief Returns the held object at the index, or a default value if not present
*
* @param index
* @return const ValueType&
*/
const ValueType& getWithDefault(int index) const noexcept const ValueType& getWithDefault(int index) const noexcept
{ {
auto it = container.find(index); auto it = container.find(index);
@ -48,6 +67,12 @@ public:
} }
} }
/**
* @brief Get the value at index key or emplace a new one if not present
*
* @param key the index of the element
* @return ValueType&
*/
ValueType& operator[](const int& key) noexcept ValueType& operator[](const int& key) noexcept
{ {
if (!contains(key)) if (!contains(key))
@ -55,8 +80,27 @@ public:
return container.operator[](key); return container.operator[](key);
} }
/**
* @brief Is the container empty
*
* @return true
* @return false
*/
inline bool empty() const { return container.empty(); } inline bool empty() const { return container.empty(); }
/**
* @brief Returns the value at index with bounds checking (and possibly exceptions)
*
* @param index
* @return const ValueType&
*/
const ValueType& at(int index) const { return container.at(index); } const ValueType& at(int index) const { return container.at(index); }
/**
* @brief Returns true if the container containers an element at index
*
* @param index
* @return true
* @return false
*/
bool contains(int index) const noexcept { return container.find(index) != container.end(); } bool contains(int index) const noexcept { return container.find(index) != container.end(); }
typename std::map<int, ValueType>::iterator begin() { return container.begin(); } typename std::map<int, ValueType>::iterator begin() { return container.begin(); }
typename std::map<int, ValueType>::iterator end() { return container.end(); } typename std::map<int, ValueType>::iterator end() { return container.end(); }
@ -65,4 +109,4 @@ private:
std::map<int, ValueType> container; std::map<int, ValueType> container;
LEAK_DETECTOR(CCMap); LEAK_DETECTOR(CCMap);
}; };
} }