#pragma once #include #include namespace scwx { namespace util { template Container::const_iterator GetBoundedElementIterator(Container& container, const typename Container::key_type& key) { // Find the first element greater than the key requested typename Container::const_iterator it = container.upper_bound(key); // An element with a key greater was found if (it != container.cend()) { // Are there elements prior to this element? if (it != container.cbegin()) { // Get the element immediately preceding, this the element we are // looking for --it; } else { // The current element is a good substitute } } else if (container.size() > 0) { // An element with a key greater was not found. If it exists, it must be // the last element. Decrement the end iterator. --it; } return it; } template ReturnType GetBoundedElementPointer(Container& container, const typename Container::key_type& key) { ReturnType elementPtr {nullptr}; auto it = GetBoundedElementIterator(container, key); if (it != container.cend()) { elementPtr = &(*(it)); } return elementPtr; } template> ReturnType GetBoundedElement(std::map& map, const Key& key) { ReturnType element; typename std::map::const_pointer elementPtr = GetBoundedElementPointer, typename std::map::const_pointer>(map, key); if (elementPtr != nullptr) { element = elementPtr->second; } return element; } template inline T GetBoundedElementValue(std::map& map, const Key& key) { return GetBoundedElement(map, key); } } // namespace util } // namespace scwx