//===========================================================================// // File: plug.hpp // // Contents: Interface specifications for plugs and their iterators // //---------------------------------------------------------------------------// // Copyright (C) Microsoft Corporation. All rights reserved. // //===========================================================================// #pragma once #include "Stuff.hpp" #include "RegisteredClass.hpp" #include "Iterator.hpp" #include "Link.hpp" namespace Stuff { //########################################################################## //############################ Plug ################################## //########################################################################## class PlugIterator; typedef RegisteredClass__ClassData Plug__ClassData; extern HGOSHEAP ConnectionEngineHeap; class Plug : public RegisteredClass { friend class Link; friend class PlugIterator; friend class Socket; public: static void InitializeClass(); static void TerminateClass(); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Constructor/Destructor // public: ~Plug(); protected: explicit Plug(ClassData *class_data); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class Data Support // public: typedef Plug__ClassData ClassData; static ClassData *DefaultData; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Utilities // public: CollectionSize GetSocketCount(); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Testing // public: void TestInstance() const; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Private methods // private: void RemoveSocket(Socket *socket); bool IsSocketMember(Socket *socket); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Private data // private: Link *linkHead; }; //########################################################################## //############################ PlugOf ################################ //########################################################################## template class PlugOf: public Plug { //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Constructor, Destructor // public: // //-------------------------------------------------------------------- // Constructor, Destructor //-------------------------------------------------------------------- // explicit PlugOf(const T &item); ~PlugOf(); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Accessors, Casting // public: T GetItem() const {return item;} T* GetPointer() {return &item;} operator T() const {return item;} //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Private data // private: T item; }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PlugOf templates ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ template PlugOf::PlugOf(const T &the_item): Plug(DefaultData) { item = the_item; } template PlugOf::~PlugOf() { } //########################################################################## //######################## PlugIterator ############################## //########################################################################## class PlugIterator: public Iterator { //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Constructor, destructor & testing // public: explicit PlugIterator( Plug *plug, RegisteredClass::ClassID class_to_iterate=NullClassID ); PlugIterator(const PlugIterator &iterator); ~PlugIterator(); void TestInstance() const; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Iterator methods (see Iterator for full listing) // public: void First(); void Last(); void Next(); void Previous(); CollectionSize GetSize(); void Remove(); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Protected implementation // protected: void* ReadAndNextImplementation(); void* ReadAndPreviousImplementation(); void* GetCurrentImplementation(); void* GetNthImplementation(CollectionSize index); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Protected data // protected: Plug *plug; Link *currentLink; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Private methods and data // private: void NextNode(); void PreviousNode(); RegisteredClass::ClassID classToIterate; }; //########################################################################## //####################### PlugIteratorOf ############################# //########################################################################## template class PlugIteratorOf: public PlugIterator { //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Constructor, destructor // public: PlugIteratorOf( Plug *plug, RegisteredClass::ClassID class_to_iterate=NullClassID ); PlugIteratorOf( Plug &plug, RegisteredClass::ClassID class_to_iterate=NullClassID ); PlugIteratorOf(const PlugIteratorOf &iterator); Iterator* MakeClone() {Check_Object(this); return new PlugIteratorOf(*this);} ~PlugIteratorOf(); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Iterator methods (see Iterator for full listing) // public: T ReadAndNext() {return (T)ReadAndNextImplementation();} T ReadAndPrevious() {return (T)ReadAndPreviousImplementation();} T GetCurrent() {return (T)GetCurrentImplementation();} T GetNth(CollectionSize index) {return (T)GetNthImplementation(index);} }; //~~~~~~~~~~~~~~~~~~~~~~~ PlugIteratorOf templates ~~~~~~~~~~~~~~~~~~~~~~~~~ template PlugIteratorOf::PlugIteratorOf( Plug *plug, RegisteredClass::ClassID class_to_iterate ): PlugIterator(plug, class_to_iterate) { } template PlugIteratorOf::PlugIteratorOf( Plug &plug, RegisteredClass::ClassID class_to_iterate ): PlugIterator(&plug, class_to_iterate) { } template PlugIteratorOf::PlugIteratorOf(const PlugIteratorOf &iterator): PlugIterator(iterator) { } template PlugIteratorOf::~PlugIteratorOf() { } }