summaryrefslogtreecommitdiff
path: root/boost/sort/common/stack_cnc.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/sort/common/stack_cnc.hpp')
-rw-r--r--boost/sort/common/stack_cnc.hpp142
1 files changed, 142 insertions, 0 deletions
diff --git a/boost/sort/common/stack_cnc.hpp b/boost/sort/common/stack_cnc.hpp
new file mode 100644
index 0000000000..d4d6e53b25
--- /dev/null
+++ b/boost/sort/common/stack_cnc.hpp
@@ -0,0 +1,142 @@
+//----------------------------------------------------------------------------
+/// @file stack_cnc.hpp
+/// @brief This file contains the implementation concurrent stack
+///
+/// @author Copyright (c) 2010 2015 Francisco José Tapia (fjtapia@gmail.com )\n
+/// Distributed under the Boost Software License, Version 1.0.\n
+/// ( See accompanyingfile LICENSE_1_0.txt or copy at
+/// http://www.boost.org/LICENSE_1_0.txt )
+/// @version 0.1
+///
+/// @remarks
+//-----------------------------------------------------------------------------
+#ifndef __BOOST_SORT_PARALLEL_DETAIL_UTIL_STACK_CNC_HPP
+#define __BOOST_SORT_PARALLEL_DETAIL_UTIL_STACK_CNC_HPP
+
+#include <boost/sort/common/spinlock.hpp>
+#include <vector>
+
+namespace boost
+{
+namespace sort
+{
+namespace common
+{
+
+//
+//###########################################################################
+// ##
+// ################################################################ ##
+// # # ##
+// # C L A S S # ##
+// # S T A C K _ C N C # ##
+// # # ##
+// ################################################################ ##
+// ##
+//###########################################################################
+//
+//---------------------------------------------------------------------------
+/// @class stack_cnc
+/// @brief This class is a concurrent stack controled by a spin_lock
+/// @remarks
+//---------------------------------------------------------------------------
+template<typename T, typename Allocator = std::allocator<T> >
+class stack_cnc
+{
+public:
+ //------------------------------------------------------------------------
+ // D E F I N I T I O N S
+ //------------------------------------------------------------------------
+ typedef std::vector<T, Allocator> vector_t;
+ typedef typename vector_t::size_type size_type;
+ typedef typename vector_t::difference_type difference_type;
+ typedef typename vector_t::value_type value_type;
+ typedef typename vector_t::pointer pointer;
+ typedef typename vector_t::const_pointer const_pointer;
+ typedef typename vector_t::reference reference;
+ typedef typename vector_t::const_reference const_reference;
+ typedef typename vector_t::allocator_type allocator_type;
+ typedef Allocator alloc_t;
+
+protected:
+ //-------------------------------------------------------------------------
+ // INTERNAL VARIABLES
+ //-------------------------------------------------------------------------
+ vector_t v_t;
+ mutable spinlock_t spl;
+
+public:
+ //
+ //-------------------------------------------------------------------------
+ // function : stack_cnc
+ /// @brief constructor
+ //-------------------------------------------------------------------------
+ explicit stack_cnc(void): v_t() { };
+
+ //
+ //-------------------------------------------------------------------------
+ // function : stack_cnc
+ /// @brief Move constructor
+ //-------------------------------------------------------------------------
+ stack_cnc(stack_cnc &&) = delete;
+ //
+ //-------------------------------------------------------------------------
+ // function : ~stack_cnc
+ /// @brief Destructor
+ //-------------------------------------------------------------------------
+ virtual ~stack_cnc(void) { v_t.clear(); };
+
+ //-------------------------------------------------------------------------
+ // function : emplace_back
+ /// @brief Insert one element in the back of the container
+ /// @param args : group of arguments for to build the object to insert. Can
+ /// be values, references or rvalues
+ //-------------------------------------------------------------------------
+ template<class ... Args>
+ void emplace_back(Args &&... args)
+ {
+ std::lock_guard < spinlock_t > guard(spl);
+ v_t.emplace_back(std::forward< Args > (args)...);
+ };
+
+ //
+ //-------------------------------------------------------------------------
+ // function :pop_move_back
+ /// @brief if exist, move the last element to P, and delete it
+ /// @param P : reference to a variable where move the element
+ /// @return true - Element moved and deleted
+ /// false - Empty stack_cnc
+ //-------------------------------------------------------------------------
+ bool pop_move_back(value_type &P)
+ {
+ std::lock_guard < spinlock_t > S(spl);
+ if (v_t.size() == 0) return false;
+ P = std::move(v_t.back());
+ v_t.pop_back();
+ return true;
+ };
+ //-------------------------------------------------------------------------
+ // function : push_back
+ /// @brief Insert one vector at the end of the container
+ /// @param v_other : vector to insert
+ /// @return reference to the stack_cnc after the insertion
+ //-------------------------------------------------------------------------
+ template<class Allocator2>
+ stack_cnc &push_back(const std::vector<value_type, Allocator2> &v_other)
+ {
+ std::lock_guard < spinlock_t > guard(spl);
+ for (size_type i = 0; i < v_other.size(); ++i)
+ {
+ v_t.push_back(v_other[i]);
+ }
+ return *this;
+ };
+};
+// end class stack_cnc
+
+//***************************************************************************
+};// end namespace common
+};// end namespace sort
+};// end namespace boost
+//***************************************************************************
+#endif