//===========================================================================// // 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 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 ChainOf::ChainOf(Node *node): Chain(node) { } template ChainOf::~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 ChainIteratorOf: public ChainIterator { public: // //-------------------------------------------------------------------- //-------------------------------------------------------------------- // Public interface //-------------------------------------------------------------------- //-------------------------------------------------------------------- // // //-------------------------------------------------------------------- // Constructors and Destructor //-------------------------------------------------------------------- // ChainIteratorOf(ChainOf *chain); ChainIteratorOf(const ChainIteratorOf &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& Begin() {return (ChainIteratorOf&)BeginImplementation();} ChainIteratorOf& End() {return (ChainIteratorOf&)EndImplementation();} ChainIteratorOf& Forward() {return (ChainIteratorOf&)ForwardImplementation();} ChainIteratorOf& Backward() {return (ChainIteratorOf&)BackwardImplementation();} }; //~~~~~~~~~~~~~~~~~~~~~~~ ChainIteratorOf templates ~~~~~~~~~~~~~~~~~~~~~~~~ template ChainIteratorOf::ChainIteratorOf(ChainOf *chain): ChainIterator(chain) { } template ChainIteratorOf::ChainIteratorOf(const ChainIteratorOf &iterator): ChainIterator(iterator) { } template Iterator* ChainIteratorOf::MakeClone() { return new ChainIteratorOf(*this); } template ChainIteratorOf::~ChainIteratorOf() { } }