diff --git a/containers_cpp/include/embb/containers/blocking_map.h b/containers_cpp/include/embb/containers/blocking_map.h new file mode 100755 index 0000000..3d857fa --- /dev/null +++ b/containers_cpp/include/embb/containers/blocking_map.h @@ -0,0 +1,65 @@ +/* +* Copyright (c) 2014-2016, Siemens AG. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef EMBB_CONTAINERS_BLOCKING_MAP_H_ +#define EMBB_CONTAINERS_BLOCKING_MAP_H_ + +#include +#include + +namespace embb { +namespace containers { + +template< typename Key, typename Value> +class BlockingMap { + typedef embb::base::Mutex Mutex; + typedef embb::base::LockGuard<> LockGuard; + + private: + std::map internalMap; + + Mutex mutex; + + public: + BlockingMap(); + + bool Insert(const Key& key, const Value& value); + + bool Erase(const Key& key); + + bool Contains(const Key& key); + + Value& operator[](const Key& key); + +}; + +} +} + +#include + +#endif EMBB_CONTAINERS_BLOCKING_MAP_H_ + diff --git a/containers_cpp/include/embb/containers/internal/blocking_map-inl.h b/containers_cpp/include/embb/containers/internal/blocking_map-inl.h new file mode 100755 index 0000000..84e2ebb --- /dev/null +++ b/containers_cpp/include/embb/containers/internal/blocking_map-inl.h @@ -0,0 +1,67 @@ +/* +* Copyright (c) 2014-2016, Siemens AG. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef EMBB_CONTAINERS_INTERNAL_BLOCKING_MAP_INL_H_ +#define EMBB_CONTAINERS_INTERNAL_BLOCKING_SET_INL_H_ + + +namespace embb { +namespace containers { + +template +BlockingMap::BlockingMap() : + internalMap() {} + + +template +bool BlockingMap::Insert(const K& key, const V& value) { + LockGuard lock(mutex); + return internalMap.insert(std::map::value_type(key, value)).second; +} + +template +bool BlockingMap::Erase(const K& key) { + LockGuard lock(mutex); + return internalMap.erase(key) > 0; +} + +template +bool BlockingMap::Contains(const K& key) { + LockGuard lock(mutex); + return internalMap.count(key) > 0; +} + +template +V& BlockingMap::operator[](const K& key) { + LockGuard lock(mutex); + return internalMap[key]; +} + + +} +} + +#endif // EMBB_CONTAINERS_INTERNAL_BLOCKING_MAP_INL_H_ \ No newline at end of file