⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chain.hpp

📁 机甲指挥官2源代码
💻 HPP
字号:
//===========================================================================//
// File:	chain.hh                                                         //
// Contents: Interface specification of Chains and their iterators           //
//---------------------------------------------------------------------------//
// Copyright (C) Microsoft Corporation. All rights reserved.                 //
//===========================================================================//

#pragma once

#include "Stuff.hpp"
#include "Node.hpp"
#include "MemoryBlock.hpp"

namespace Stuff {

	class Chain;
	class ChainIterator;

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ChainLink ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	enum {
		ChainLink_MemoryBlock_Allocation = 1000
	};

	class ChainLink : public Link
	{
	public:
		friend class Chain;
		friend class ChainIterator;

		static void
			InitializeClass(
				size_t block_count = ChainLink_MemoryBlock_Allocation,
				size_t block_delta = ChainLink_MemoryBlock_Allocation
			);
		static void
			TerminateClass();

	public:
		~ChainLink();
		void
			TestInstance()
				{}

	private:
		ChainLink(
			Chain *chain,
			Plug *plug,
			ChainLink *nextChainLink,
			ChainLink *prevChainLink
		);

		ChainLink
			*nextChainLink,
			*prevChainLink;

	private:
		static MemoryBlock
	    	*AllocatedMemory;

		void*
			operator new(size_t)
				{return AllocatedMemory->New();}
		void
			operator delete(void *where)
				{AllocatedMemory->Delete(where);}
	};

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Chain ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	class Chain:
		public Socket
	{
		friend class ChainLink;
		friend class ChainIterator;

	public:
		//
		//--------------------------------------------------------------------
		//--------------------------------------------------------------------
		// Public interface
		//--------------------------------------------------------------------
		//--------------------------------------------------------------------
		//

		//
		//--------------------------------------------------------------------
		// Constructor, Destructor and testing
		//--------------------------------------------------------------------
		//
		explicit Chain(Node *node);
		~Chain();

		void
			TestInstance()
				{}
		static bool
			TestClass();
		static bool
			ProfileClass();

		//
		//-----------------------------------------------------------------------
		// IsEmpty - Returns true if the socket contains no plugs.
		//-----------------------------------------------------------------------
		//
		bool
			IsEmpty();

	protected:
		//
		//--------------------------------------------------------------------
		//--------------------------------------------------------------------
		// Protected interface
		//--------------------------------------------------------------------
		//--------------------------------------------------------------------
		//
		void
			AddImplementation(Plug *plug);

	private:
		//
		//--------------------------------------------------------------------
		// Private methods
		//--------------------------------------------------------------------
		//
		ChainLink*
			InsertChainLink(
				Plug *plug,
				ChainLink *current_link
			);

		//
		//--------------------------------------------------------------------
		// Private data
		//--------------------------------------------------------------------
		//
		ChainLink
			*head,
			*tail;
	};

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ChainOf ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	template <class T> class ChainOf:
		public Chain
	{
	public:
		//
		//--------------------------------------------------------------------
		//--------------------------------------------------------------------
		// Public interface
		//--------------------------------------------------------------------
		//--------------------------------------------------------------------
		//
		explicit ChainOf(Node *node);
		~ChainOf();

		//
		//--------------------------------------------------------------------
		// Socket methods (see Socket for full listing)
		//--------------------------------------------------------------------
		//
		void
			Add(T plug)
				{AddImplementation(Cast_Pointer(Plug*, plug));}
		void
			Remove(T plug)
				{RemovePlug(Cast_Pointer(Plug*, plug));}
	};

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~ ChainOf templates ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	template <class T>
		ChainOf<T>::ChainOf(Node *node):
			Chain(node)
	{
	}

	template <class T>
		ChainOf<T>::~ChainOf()
	{
	}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~ ChainIterator ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	class ChainIterator:
		public SocketIterator
	{
	public:
		//
		//--------------------------------------------------------------------
		//--------------------------------------------------------------------
		// Public interface
		//--------------------------------------------------------------------
		//--------------------------------------------------------------------
		//

		//
		//--------------------------------------------------------------------
		// Constructors, Destructor and testing
		//--------------------------------------------------------------------
		//
		explicit ChainIterator(Chain *chain):
			SocketIterator(chain)
				{Check_Object(chain); currentLink = chain->head;}

		ChainIterator(const ChainIterator &iterator):
			SocketIterator(iterator.socket)
				{Check_Object(&iterator); currentLink = iterator.currentLink;}

		~ChainIterator()
			{}
		
		void
			TestInstance() const
				{}

		//
		//--------------------------------------------------------------------
		// Iterator methods (see Iterator for full listing)
		//--------------------------------------------------------------------
		//
		void
			First();
		void
			Last();
		void
			Next();
		void
			Previous();
		CollectionSize
			GetSize();
		void
			Remove();

	protected:
		//
		//--------------------------------------------------------------------
		//--------------------------------------------------------------------
		// Protected interface
		//--------------------------------------------------------------------
		//--------------------------------------------------------------------
		//
		void*
			ReadAndNextImplementation();
		void*
			ReadAndPreviousImplementation();
		void*
			GetCurrentImplementation();
		void*
			GetNthImplementation(CollectionSize index);
		void
			InsertImplementation(Plug*);

		//
		//--------------------------------------------------------------------
		//--------------------------------------------------------------------
		// Protected data
		//--------------------------------------------------------------------
		//--------------------------------------------------------------------
		//
		ChainLink
			*currentLink;
	};

	inline void*
		ChainIterator::ReadAndNextImplementation()
	{
		if (currentLink != NULL)
		{
			Check_Object(currentLink);
			Plug *plug = currentLink->plug;
			currentLink = currentLink->nextChainLink;
			return plug;
		}
		return NULL;
	}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~ ChainIteratorOf ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	template <class T> class ChainIteratorOf:
		public ChainIterator
	{
	public:
  		//
		//--------------------------------------------------------------------
		//--------------------------------------------------------------------
		// Public interface
		//--------------------------------------------------------------------
		//--------------------------------------------------------------------
		//

		//
		//--------------------------------------------------------------------
		// Constructors and Destructor
		//--------------------------------------------------------------------
		//
		ChainIteratorOf(ChainOf<T> *chain);
		ChainIteratorOf(const ChainIteratorOf<T> &iterator);
		Iterator*
			MakeClone();
		~ChainIteratorOf();

		//
		//--------------------------------------------------------------------
		// Iterator methods (see Iterator for full listing)
		//--------------------------------------------------------------------
		//
		T
			ReadAndNext()
				{return (T)ReadAndNextImplementation();}
		T
			ReadAndPrevious()
				{return (T)ReadAndPreviousImplementation();}
		T
			GetCurrent()
				{return (T)GetCurrentImplementation();}
		T
			GetNth(CollectionSize index)
				{return (T)GetNthImplementation(index);}
		void
			Insert(T plug)
				{InsertImplementation(Cast_Object(Plug*,plug));}

		ChainIteratorOf<T>&
			Begin()
				{return (ChainIteratorOf<T>&)BeginImplementation();}
		ChainIteratorOf<T>&
			End()
				{return (ChainIteratorOf<T>&)EndImplementation();}
		ChainIteratorOf<T>&
			Forward()
				{return (ChainIteratorOf<T>&)ForwardImplementation();}
		ChainIteratorOf<T>&
			Backward()
				{return (ChainIteratorOf<T>&)BackwardImplementation();}
	};

	//~~~~~~~~~~~~~~~~~~~~~~~ ChainIteratorOf templates ~~~~~~~~~~~~~~~~~~~~~~~~

	template <class T>
		ChainIteratorOf<T>::ChainIteratorOf(ChainOf<T> *chain):
			ChainIterator(chain)
	{
	}

	template <class T>
		ChainIteratorOf<T>::ChainIteratorOf(const ChainIteratorOf<T> &iterator):
			ChainIterator(iterator)
	{
	}

	template <class T> Iterator*
		ChainIteratorOf<T>::MakeClone()
	{
		return new ChainIteratorOf<T>(*this);
	}

	template <class T>
		ChainIteratorOf<T>::~ChainIteratorOf()
	{
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -