src/Containers.h

changeset 119
bdf8d46c145f
parent 118
e3361cf7cbf4
child 120
5ea0faefa82a
--- a/src/Containers.h	Sun Mar 30 21:35:06 2014 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,358 +0,0 @@
-/*
-	Copyright 2012-2014 Santeri Piippo
-	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.
-	3. The name of the author may not be used to endorse or promote products
-	   derived from this software without specific prior written permission.
-
-	THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 BOTC_CONTAINERS_H
-#define BOTC_CONTAINERS_H
-
-#include <cassert>
-#include <algorithm>
-#include <deque>
-#include <initializer_list>
-
-template<typename T>
-class List
-{
-	public:
-		using WrappedList				= typename std::deque<T>;
-		using Iterator					= typename WrappedList::iterator;
-		using ConstIterator				= typename WrappedList::const_iterator;
-		using ReverseIterator			= typename WrappedList::reverse_iterator;
-		using ConstReverseIterator		= typename WrappedList::const_reverse_iterator;
-		using ValueType					= T;
-		using Self						= List<T>;
-
-		// =====================================================================
-		//
-		List() {}
-
-		// =====================================================================
-		//
-		List (std::initializer_list<ValueType> vals)
-		{
-			m_data = vals;
-		}
-
-		// =====================================================================
-		//
-		List (const WrappedList& a) :
-			m_data (a) {}
-
-		// =====================================================================
-		//
-		Iterator begin()
-		{
-			return m_data.begin();
-		}
-
-		// =====================================================================
-		//
-		ConstIterator begin() const
-		{
-			return m_data.cbegin();
-		}
-
-		// =====================================================================
-		//
-		Iterator end()
-		{
-			return m_data.end();
-		}
-
-		// =====================================================================
-		//
-		ConstIterator end() const
-		{
-			return m_data.cend();
-		}
-
-		// =====================================================================
-		//
-		ReverseIterator rbegin()
-		{
-			return m_data.rbegin();
-		}
-
-		// =====================================================================
-		//
-		ConstReverseIterator crbegin() const
-		{
-			return m_data.crbegin();
-		}
-
-		// =====================================================================
-		//
-		ReverseIterator rend()
-		{
-			return m_data.rend();
-		}
-
-		// =====================================================================
-		//
-		ConstReverseIterator crend() const
-		{
-			return m_data.crend();
-		}
-
-		// =====================================================================
-		//
-		inline void removeAt (int pos)
-		{
-			assert (pos < size());
-			m_data.erase (m_data.begin() + pos);
-		}
-
-		// =====================================================================
-		//
-		ValueType& prepend (const ValueType& value)
-		{
-			m_data.push_front (value);
-			return m_data[0];
-		}
-
-		// =====================================================================
-		//
-		ValueType& append (const ValueType& value)
-		{
-			m_data.push_back (value);
-			return m_data[m_data.size() - 1];
-		}
-
-		// =====================================================================
-		//
-		void merge (const Self& other)
-		{
-			resize (size() + other.size());
-			std::copy (other.begin(), other.end(), begin() + other.size());
-		}
-
-		// =====================================================================
-		//
-		bool pop (T& val)
-		{
-			if (isEmpty())
-				return false;
-
-			val = m_data[size() - 1];
-			m_data.erase (m_data.end() - 1);
-			return true;
-		}
-
-		// =====================================================================
-		//
-		Self& operator<< (const T& value)
-		{
-			append (value);
-			return *this;
-		}
-
-		// =====================================================================
-		//
-		void operator<< (const Self& vals)
-		{
-			merge (vals);
-		}
-
-		// =====================================================================
-		//
-		bool operator>> (T& value)
-		{
-			return pop (value);
-		}
-
-		// =====================================================================
-		//
-		Self reverse() const
-		{
-			Self rev;
-
-			for (const T & val : *this)
-				val >> rev;
-
-			return rev;
-		}
-
-		// =====================================================================
-		//
-		void clear()
-		{
-			m_data.clear();
-		}
-
-		// =====================================================================
-		//
-		void insert (int pos, const ValueType& value)
-		{
-			m_data.insert (m_data.begin() + pos, value);
-		}
-
-		// =====================================================================
-		//
-		void removeDuplicates()
-		{
-			// Remove duplicate entries. For this to be effective, the vector must be
-			// sorted first.
-			sort();
-			Iterator pos = std::unique (begin(), end());
-			resize (std::distance (begin(), pos));
-		}
-
-		// =====================================================================
-		//
-		int size() const
-		{
-			return m_data.size();
-		}
-
-		// =====================================================================
-		//
-		ValueType& operator[] (int n)
-		{
-			assert (n < size());
-			return m_data[n];
-		}
-
-		// =====================================================================
-		//
-		const ValueType& operator[] (int n) const
-		{
-			assert (n < size());
-			return m_data[n];
-		}
-
-		// =====================================================================
-		//
-		void resize (int size)
-		{
-			m_data.resize (size);
-		}
-
-		// =====================================================================
-		//
-		void sort()
-		{
-			std::sort (begin(), end());
-		}
-
-		// =====================================================================
-		//
-		int find (const ValueType& needle) const
-		{
-			int i = 0;
-
-			for (const ValueType& hay : *this)
-			{
-				if (hay == needle)
-					return i;
-
-				i++;
-			}
-
-			return -1;
-		}
-
-		// =====================================================================
-		//
-		void removeOne (const ValueType& it)
-		{
-			int idx;
-
-			if ((idx = find (it)) != -1)
-				removeAt (idx);
-		}
-
-		// =====================================================================
-		//
-		inline bool isEmpty() const
-		{
-			return size() == 0;
-		}
-
-		// =====================================================================
-		//
-		Self splice (int a, int b) const
-		{
-			assert (a >= 0 && b >= 0 && a < size() && b < size() && a <= b);
-			Self result;
-
-			for (int i = a; i <= b; ++i)
-				result << operator[] (i);
-
-			return result;
-		}
-
-		// =====================================================================
-		//
-		inline const WrappedList& deque() const
-		{
-			return m_data;
-		}
-
-		// =====================================================================
-		//
-		inline const ValueType& first() const
-		{
-			return *m_data.begin();
-		}
-
-		// =====================================================================
-		//
-		inline const ValueType& last() const
-		{
-			return *(m_data.end() - 1);
-		}
-
-		// =====================================================================
-		//
-		inline bool contains (const ValueType& a) const
-		{
-			return find (a) != -1;
-		}
-
-		// =====================================================================
-		//
-		Self operator+ (const Self& other) const
-		{
-			Self out (*this);
-			out.merge (other);
-			return out;
-		}
-
-	private:
-		WrappedList m_data;
-};
-
-// =============================================================================
-//
-template<typename T>
-List<T>& operator>> (const T& value, List<T>& haystack)
-{
-	haystack.prepend (value);
-	return haystack;
-}
-
-#endif // BOTC_CONTAINERS_H

mercurial