| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- /*
- ** 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 <http://www.gnu.org/licenses/>.
- */
- ////////////////////////////////////////////////////////////////////////////////
- // //
- // (c) 2001-2003 Electronic Arts Inc. //
- // //
- ////////////////////////////////////////////////////////////////////////////////
- // FILE: FunctionLexicon.h ////////////////////////////////////////////////////////////////////////
- // Created: Colin Day, September 2001
- // Desc: Collection of function pointers to help us in managing
- // and assign callbacks
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- #pragma once
- #ifndef __FUNCTIONLEXICON_H_
- #define __FUNCTIONLEXICON_H_
- #include "Common/SubsystemInterface.h"
- #include "Common/NameKeyGenerator.h"
- #include "Common/GameMemory.h"
- #include "GameClient/GameWindow.h"
- #include "GameClient/WindowLayout.h"
- //-------------------------------------------------------------------------------------------------
- /** Collection of function pointers to help us in managing callbacks */
- //-------------------------------------------------------------------------------------------------
- class FunctionLexicon : public SubsystemInterface
- {
- public:
- struct TableEntry
- {
- NameKeyType key;
- const char *name;
- void *func;
- };
- enum TableIndex
- {
- TABLE_ANY = -1, ///< use this when searching to search any table
- TABLE_GAME_WIN_SYSTEM = 0,
- TABLE_GAME_WIN_INPUT,
- TABLE_GAME_WIN_TOOLTIP,
- TABLE_GAME_WIN_DEVICEDRAW,
- TABLE_GAME_WIN_DRAW,
- TABLE_WIN_LAYOUT_INIT,
- TABLE_WIN_LAYOUT_DEVICEINIT,
- TABLE_WIN_LAYOUT_UPDATE,
- TABLE_WIN_LAYOUT_SHUTDOWN,
- MAX_FUNCTION_TABLES // keep this last
- };
- public:
- FunctionLexicon( void );
- virtual ~FunctionLexicon( void );
- virtual void init( void );
- virtual void reset( void );
- virtual void update( void );
- /// validate the tables and make sure all entries are unique
- Bool validate( void );
- /// get internal function table
- TableEntry *getTable( TableIndex index );
- //
- // !NOTE! We do NOT have a functionToName() method becuase we assume
- // that functions in the tables are unique and that there is a 1 to 1
- // mapping of a symbol to a function address. However, when compiling
- // in release, functions that have the same arguments and the same
- // body (mainly empty stub functions) get optimized to the
- // SAME ADDRESS. That destroyes our 1 to 1 mapping so it is something
- // that we must avoid
- //
- // translate a function pointer to its symbolic name
- // char *functionToName( void *func );
- // Game window functions ------------------------------------------------------------------------
- GameWinSystemFunc gameWinSystemFunc( NameKeyType key, TableIndex = TABLE_GAME_WIN_SYSTEM );
- GameWinInputFunc gameWinInputFunc( NameKeyType key, TableIndex = TABLE_GAME_WIN_INPUT );
- GameWinTooltipFunc gameWinTooltipFunc( NameKeyType key, TableIndex = TABLE_GAME_WIN_TOOLTIP );
- GameWinDrawFunc gameWinDrawFunc( NameKeyType key, TableIndex = TABLE_ANY );
- // Window layout functions ----------------------------------------------------------------------
- WindowLayoutInitFunc winLayoutInitFunc( NameKeyType key, TableIndex = TABLE_ANY );
- WindowLayoutUpdateFunc winLayoutUpdateFunc( NameKeyType key, TableIndex = TABLE_WIN_LAYOUT_UPDATE );
- WindowLayoutShutdownFunc winLayoutShutdownFunc( NameKeyType key, TableIndex = TABLE_WIN_LAYOUT_SHUTDOWN );
- protected:
- /// load a lookup table with run time values needed and save in table list
- void loadTable( TableEntry *table, TableIndex tableIndex );
- /** given a key find the function, the index parameter can limit the search
- to a single table or to ANY of the tables */
- void *findFunction( NameKeyType key, TableIndex index );
-
- #ifdef NOT_IN_USE
- const char *funcToName( void *func, TableEntry *table ); ///< internal searching
- #endif
- void *keyToFunc( NameKeyType key, TableEntry *table ); ///< internal searching
- TableEntry *m_tables[ MAX_FUNCTION_TABLES ]; ///< the lookup tables
- }; // end class FunctionLexicon
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- // INLINING
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- inline FunctionLexicon::TableEntry *FunctionLexicon::getTable( TableIndex index )
- { return m_tables[ index ]; }
- inline GameWinSystemFunc FunctionLexicon::gameWinSystemFunc( NameKeyType key, TableIndex index )
- { return (GameWinSystemFunc)findFunction( key, index ); }
- inline GameWinInputFunc FunctionLexicon::gameWinInputFunc( NameKeyType key, TableIndex index )
- { return (GameWinInputFunc)findFunction( key, index ); }
- inline GameWinTooltipFunc FunctionLexicon::gameWinTooltipFunc( NameKeyType key, TableIndex index )
- { return (GameWinTooltipFunc)findFunction( key, index ); }
- inline WindowLayoutUpdateFunc FunctionLexicon::winLayoutUpdateFunc( NameKeyType key, TableIndex index )
- { return (WindowLayoutUpdateFunc)findFunction( key, index ); }
- inline WindowLayoutShutdownFunc FunctionLexicon::winLayoutShutdownFunc( NameKeyType key, TableIndex index )
- { return (WindowLayoutShutdownFunc)findFunction( key, index ); }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- // EXTERNALS
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- extern FunctionLexicon *TheFunctionLexicon; ///< function dictionary external
- #endif // end __FUNCTIONLEXICON_H_
|