/* * Descent 3 * Copyright (C) 2024 Parallax Software * * 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 . --- HISTORICAL COMMENTS FOLLOW --- * $Logfile: /DescentIII/Main/lib/psclass.h $ * $Revision: 8 $ * $Date: 4/16/99 4:26a $ * $Author: Jeff $ * * New Class Library * * $Log: /DescentIII/Main/lib/psclass.h $ * * 8 4/16/99 4:26a Jeff * removed ifdef of linux since new compiler compiles it * * 7 4/15/99 1:44a Jeff * changes for linux compile * * 6 12/16/98 1:57p Samir * Replaced CleanupString2 with CleanupStr * * 5 10/02/98 11:16a Jeff * removed 'struct' from the template, generates an error in VC6 that * keeps it from compiling * * 4 9/17/98 7:05p Samir * added string token class. * * 3 7/28/98 5:42p Samir * added queue class. * * 2 7/23/98 11:36a Samir * Added class library header. * * $NoKeywords: $ */ #ifndef PSCLASS_H #define PSCLASS_H #include // a universal list node to use with the list type template struct tListNode { T t; tListNode *next; }; // LIST CLASSES // // tList // this is a VERY BASIC list class that encapsulates a lot // of list operations into one class. this class handles list NODES ONLY. // a more advanced form is to come, but this is for those hardcode programmers. // to declare say, a list that will contain integers, do this: // tList list; // tListNode *node; // node = new tListNode; // node->data = 1; // list.Link(node); // it is the programmers responsibility to create the nodes DYNAMICALLY // universal single-linked-list type template class tList { tListNode *m_link, *m_mark; int m_length; public: tList() { m_link = m_mark = nullptr; m_length = 0; }; ~tList() { tList::free(); }; // moves to start of list. used for iteration tListNode *start() { m_mark = m_link; return m_mark; } // gets next list item in iteration. if at end of list, last item will be returned. tListNode *next() { m_mark = (m_mark->next) ? m_mark->next : m_mark; return get(); }; // returns the node at the current link location in iteration. tListNode *get() const { return m_mark ? m_mark : nullptr; }; // length int length() const { return m_length; }; // frees list void free() { m_link = m_mark = nullptr; m_length = 0; }; // make a link at the current mark location. void link(tListNode *node) { if (m_link) { node->next = m_mark->next; m_mark->next = node; } else { m_link = node; node->next = nullptr; } m_mark = node; m_length++; }; // unlink a node on the list at the current mark, returning the unlinked node. tListNode *unlink() { tListNode *freenode, *node; if (!m_link) return nullptr; if (m_link == m_mark) { freenode = m_mark; m_mark = m_link = m_link->next; } else { node = m_link; while (node->next != m_mark) node = node->next; freenode = m_mark; node->next = m_mark->next; } freenode->next = nullptr; return freenode; }; }; // tQueue // a circular queue implementation template class tQueue { T m_items[t_LEN]; int16_t m_head = 0, m_tail = 0; public: void send(T &item) { // sends an item onto the queue int16_t temp = m_tail + 1; if (temp == t_LEN) temp = 0; if (temp != m_head) { m_items[m_tail] = item; m_tail = temp; } }; bool recv(T *item) { // returns an item from the queue, false if no item. if (m_head == m_tail) return false; *item = m_items[m_head++]; if (m_head == t_LEN) m_head = 0; return true; }; void flush() { // flush queue entries. m_head = m_tail = 0; }; }; #endif