/* ** Command & Conquer Generals(tm) ** Copyright 2025 Electronic Arts Inc. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . */ //////////////////////////////////////////////////////////////////////////////// // // // (c) 2001-2003 Electronic Arts Inc. // // // //////////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------= // // Westwood Studios Pacific. // // Confidential Information // Copyright(C) 2001 - All Rights Reserved // //---------------------------------------------------------------------------- // // Project: WSYS Library // // Module: // // File name: wsys/List.h // // Created: 10/31/01 // //---------------------------------------------------------------------------- #pragma once #ifndef __WSYS_LIST_H #define __WSYS_LIST_H //---------------------------------------------------------------------------- // Includes //---------------------------------------------------------------------------- #ifndef _BASE_TYPE_H_ #include #endif //---------------------------------------------------------------------------- // Forward References //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- // Type Defines //---------------------------------------------------------------------------- //================================ // LLNode //================================ /** * Link list node abstraction for WSYS. */ //================================ class LListNode { friend class LList; protected: LListNode *m_next; ///< Next node in list LListNode *m_prev; ///< Previous node in list Int m_pri; ///< Node's priority, used for sorting void *m_item; ///< Item we are referencing if any Bool m_autoDelete; ///< destroy() should call delete public: LListNode(); ///< Constructor void remove( void ); ///< Removes node from list void insert( LListNode *new_node ); ///< Inserts new_node infront of itself void append( LListNode *new_node ); ///< Appends new node after itself LListNode* next( void ); ///< Returns next node in list LListNode* prev( void ); ///< Returns previous node in list LListNode* loopNext( void ); ///< Returns next node in list, warpping round to start of list if nessecary LListNode* loopPrev( void ); ///< Returns previous node in list, wrapping round to end of list if nessecary Bool inList( void ); ///< Returns whether or not node in list Bool isHead( void ); ///< Returns whether or not this node is the head/tail node Int priority( void ); ///< Returns node's priority void setPriority( Int new_pri ); ///< Sets node's priority void* item( void ); ///< Returns the item this links to, if any void setItem( void *item ); ///< Make node point to an item void destroy( void ); ///< Delete node void autoDelete( void ); } ; //================================ // LList //================================ /** * Linked list abstraction. */ //================================ class LList { public: /// Enumeration of list sorting methods enum SortMode { ASCENDING, ///< Lower priority numbers to front of list DESCENDING ///< Higher priority numbers to front of list }; protected: LListNode m_head; ///< List head node SortMode m_sortMode; ///< What sorting method to use for this list's Add() operation Bool m_addToEndOfGroup; ///< Add nodes to end of group of nodes with same priority public: LList( ); void addToHead( LListNode *new_node ); ///< Adds new node to the front of the list void addToTail( LListNode *new_node ); ///< Adds new node to the end of the list void add( LListNode *new_node ); ///< Adds new node to list sorted by priority void addItemToHead( void *item ); ///< Adds new item to the front of the list void addItemToTail( void *item ); ///< Adds new item to the end of the list void addItem( Int pri, void *item ); ///< Adds new item to list sorted by priority Int nodeCount( void ); ///< Returns number of nodes currently in list LListNode* firstNode( void ); ///< Returns first node in list LListNode* lastNode( void ); ///< Returns last node in list LListNode* getNode( Int index ); ///< Returns node in list addressed by the zero-based index passed void setSortMode( SortMode new_mode ); ///< Sets the sorting mode for the Add() operation void addToEndOfGroup( Bool yes = TRUE ); ///< Add node to end or start of group with same priority Bool isEmpty( void ); ///< Returns whether or not the the list is empty void clear( void ); ///< Deletes all items in the list. Use with care!! void merge( LList *list ); ///< Move the contents of the specified list in to this list Bool hasItem( void *item ); ///< Tests if list has the specified item LListNode* findItem( void *item ); ///< Returns the LListNode that references item void destroy( void ); ///< Free up the list items } ; //---------------------------------------------------------------------------- // Inlining //---------------------------------------------------------------------------- inline Bool LListNode::inList( void ) { return m_prev != this; }; inline Bool LListNode::isHead( void ) { return ( m_item == (void*)&this->m_item ); }; inline Int LListNode::priority( void ) { return m_pri; }; inline void LListNode::setPriority( Int new_pri ) { m_pri = new_pri; }; inline void LListNode::autoDelete( void ) { m_autoDelete = TRUE; }; inline void* LListNode::item( void ) { return m_item; }; inline void LListNode::setItem( void *item ) { m_item = item; }; inline void LList::addToHead( LListNode *new_node ) { m_head.append( new_node); }; inline void LList::addToTail( LListNode *new_node ) { m_head.insert( new_node); }; inline LListNode* LList::firstNode( void ) { return m_head.next();} ; inline LListNode* LList::lastNode( void ) { return m_head.prev();} ; inline void LList::setSortMode( SortMode new_mode ) { m_sortMode = new_mode; }; inline Bool LList::isEmpty( void ) { return !m_head.inList(); }; inline void LList::destroy( void ) { clear();}; #endif // __GDF_LIST_H_