Commit 234fe7ef by lucapegolotti

Add implementation of blocking set

parent a7e94398
/*
* Copyright (c) 2014-2015, 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_SET_H_
#define EMBB_CONTAINERS_BLOCKING_SET_H_
#include <embb/base/base.h>
#include <set>
namespace embb {
namespace containers {
/*
* Wrapper for the standard library set.
*
* \tparam T Element type.
*/
template < typename Type >
class BlockingSet {
typedef embb::base::Mutex Mutex;
typedef embb::base::LockGuard<Mutex> LockGuard;
private:
std::set<Type> internalSet;
Mutex mutex;
public:
BlockingSet();
bool Insert(const Type& element);
bool Erase(const Type& element);
bool Contains(const Type& element);
};
}
}
#include <embb/containers/internal/blocking_set-inl.h>
#endif // EMBB_CONTAINERS_BLOCKING_CONTAINER_
\ No newline at end of file
#include "..\blocking_set.h"
/*
* Copyright (c) 2014-2015, 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_SET_INL_H_
#define EMBB_CONTAINERS_BLOCKING_SET_INL_H_
namespace embb {
namespace containers {
template<typename T>
BlockingSet<T>::BlockingSet() :
internalSet() {}
template<typename T>
bool BlockingSet<T>::Insert(const T& element){
LockGuard lock(mutex);
return internalSet.insert(element).second;
}
template<typename T>
bool BlockingSet<T>::Erase(const T& element){
LockGuard lock(mutex);
return internalSet.erase(element) > 0;
}
template<typename T>
bool BlockingSet<T>::Contains(const T& element){
LockGuard lock(mutex);
return internalSet.find(element) != internalSet.end();
}
}
}
#endif // EMBB_CONTAINERS_BLOCKING_SET_INL_H_
\ No newline at end of file
......@@ -30,6 +30,7 @@
#include <embb/containers/object_pool.h>
#include <embb/containers/lock_free_stack.h>
#include <embb/containers/lock_free_mpmc_queue.h>
#include <embb/containers/blocking_set.h>
#include <embb/base/c/memory_allocation.h>
#include <partest/partest.h>
......@@ -50,6 +51,7 @@ using embb::containers::LockFreeMPMCQueue;
using embb::containers::LockFreeStack;
using embb::containers::LockFreeTreeValuePool;
using embb::containers::WaitFreeArrayValuePool;
using embb::containers::BlockingSet;
using embb::containers::test::PoolTest;
using embb::containers::test::HazardPointerTest;
using embb::containers::test::QueueTest;
......@@ -58,6 +60,7 @@ using embb::containers::test::ObjectPoolTest;
using embb::containers::test::HazardPointerTest2;
PT_MAIN("Data Structures C++") {
unsigned int max_threads = static_cast<unsigned int>(
2 * partest::TestSuite::GetDefaultNumThreads());
embb_thread_set_max_count(max_threads);
......@@ -74,4 +77,5 @@ PT_MAIN("Data Structures C++") {
PT_RUN(ObjectPoolTest< WaitFreeArrayValuePool<bool COMMA false> >);
PT_EXPECT(embb_get_bytes_allocated() == 0);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment