DOXYGEN: doxygen changes in header files 2

Edited files in the common folder:

- bufferedstream.h
- callback.h
- config-manager.h
- coroutines.h
- cosinetables.h
- dcl.h
- debug.h
- debug-channels.h
This commit is contained in:
Bartosz Gentkowski 2020-09-20 00:48:24 +02:00 committed by Eugene Sandulenko
parent b6c5d415ee
commit c52f7e0e04
9 changed files with 265 additions and 238 deletions

View file

@ -38,36 +38,48 @@ namespace Common {
*/ */
/** /**
* Take an arbitrary ReadStream and wrap it in a custom stream which * Take an arbitrary ReadStream and wrap it in a custom stream that
* transparently provides buffering. * transparently provides buffering.
* Users can specify how big the buffer should be, and whether the wrapped * You can specify how big the buffer should be, and whether the wrapped
* stream should be disposed when the wrapper is disposed. * stream should be disposed when the wrapper is disposed.
* *
* It is safe to call this with a NULL parameter (in this case, NULL is * It is safe to call this with a NULL parameter (in this case, NULL is
* returned). * returned).
*
* @param parentStream The ReadStream to wrap in a custom stream.
* @param bufSize Size of the buffer.
* @param disposeParentStream Flag indicating whether to dispose of the wrapped stream.
*/ */
ReadStream *wrapBufferedReadStream(ReadStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream); ReadStream *wrapBufferedReadStream(ReadStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream);
/** /**
* Take an arbitrary SeekableReadStream and wrap it in a custom stream which * Take an arbitrary SeekableReadStream and wrap it in a custom stream that
* transparently provides buffering. * transparently provides buffering.
* Users can specify how big the buffer should be, and whether the wrapped * You can specify how big the buffer should be, and whether the wrapped
* stream should be disposed when the wrapper is disposed. * stream should be disposed when the wrapper is disposed.
* *
* It is safe to call this with a NULL parameter (in this case, NULL is * It is safe to call this with a NULL parameter (in this case, NULL is
* returned). * returned).
*
* @param parentStream The SeekableReadStream to wrap in a custom stream.
* @param bufSize Size of the buffer.
* @param disposeParentStream Flag indicating whether to dispose of the wrapped stream.
*/ */
SeekableReadStream *wrapBufferedSeekableReadStream(SeekableReadStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream); SeekableReadStream *wrapBufferedSeekableReadStream(SeekableReadStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream);
/** /**
* Take an arbitrary WriteStream and wrap it in a custom stream which * Take an arbitrary WriteStream and wrap it in a custom stream that
* transparently provides buffering. * transparently provides buffering.
* Users can specify how big the buffer should be. Currently, the * You can specify how big the buffer should be. Currently, the
* parent stream is \em always disposed when the wrapper is disposed. * parent stream is \em always disposed when the wrapper is disposed.
* *
* It is safe to call this with a NULL parameter (in this case, NULL is * It is safe to call this with a NULL parameter (in this case, NULL is
* returned). * returned).
*
* @param parentStream The WriteStream to wrap in a custom stream.
* @param bufSize Size of the buffer.
*/ */
WriteStream *wrapBufferedWriteStream(WriteStream *parentStream, uint32 bufSize); WriteStream *wrapBufferedWriteStream(WriteStream *parentStream, uint32 bufSize);
/** @} */ /** @} */

View file

@ -29,37 +29,36 @@ namespace Common {
* @defgroup common_callback Callbacks * @defgroup common_callback Callbacks
* @ingroup common * @ingroup common
* *
* @brief Callback templates. * @brief Callback class templates.
*
* @{ * @{
*/ */
/** /**
* BaseCallback<S> is a simple base class for object-oriented callbacks. * BaseCallback<S> is a simple base class for object-oriented callbacks.
* *
* Object-oriented callbacks are such callbacks that know exact instance * Object-oriented callbacks are callbacks that know the exact instance
* which method must be called. * of the method that must be called.
* *
* For backwards compatibility purposes, there is a GlobalFunctionCallback, * For backward compatibility purposes, GlobalFunctionCallback is available,
* which is BaseCallback<void *>, so it can be used with global C-like * which is BaseCallback<void *>, so it can be used with global C-like
* functions too. * functions too.
* *
* <S> is the type, which is passed to operator() of this callback. * \<S\> is the type that is passed to operator() of this callback.
* This allows you to specify that you accept a callback, which wants * This allows you to specify that you accept a callback that wants
* to receive an <S> object. * to receive an \<S\> object.
*/ */
template<typename S = void *> class BaseCallback { template<typename S = void *> class BaseCallback {
public: public:
BaseCallback() {} BaseCallback() {}
virtual ~BaseCallback() {} virtual ~BaseCallback() {}
virtual void operator()(S data) = 0; virtual void operator()(S data) = 0; /*!< Type of the object passed to the operator. */
}; };
/** /**
* GlobalFunctionCallback<T> is a simple wrapper for global C functions. * GlobalFunctionCallback<T> is a simple wrapper for global C functions.
* *
* If there is a method, which accepts BaseCallback<T>, you can * If a method accepts BaseCallback<T>, you can
* easily pass your C function by passing * pass your C function by passing
* new GlobalFunctionCallback<T>(yourFunction) * new GlobalFunctionCallback<T>(yourFunction)
*/ */
template<typename T> class GlobalFunctionCallback: public BaseCallback<T> { template<typename T> class GlobalFunctionCallback: public BaseCallback<T> {
@ -69,7 +68,7 @@ template<typename T> class GlobalFunctionCallback: public BaseCallback<T> {
public: public:
GlobalFunctionCallback(GlobalFunction cb): _callback(cb) {} GlobalFunctionCallback(GlobalFunction cb): _callback(cb) {}
virtual ~GlobalFunctionCallback() {} virtual ~GlobalFunctionCallback() {}
virtual void operator()(T data) { virtual void operator()(T data) { /*!< C function passed to the operator. */
if (_callback) _callback(data); if (_callback) _callback(data);
} }
}; };
@ -77,35 +76,37 @@ public:
/** /**
* Callback<T, S> implements an object-oriented callback. * Callback<T, S> implements an object-oriented callback.
* *
* <T> stands for a class which method you want to call. * \<T\> stands for a class whose method you want to call.
* <S>, again, is the type of an object passed to operator(). * \<S\> is the type of the object passed to operator().
* *
* So, if you have void MyClass::myMethod(AnotherClass) method, * So, if you have void MyClass::myMethod(AnotherClass) method,
* the corresponding callback is Callback<MyClass, AnotherClass>. * the corresponding callback is Callback<MyClass, AnotherClass>.
* You create it similarly to this: * You can create it in the following way:
* @code
* new Callback<MyClass, AnotherClass>( * new Callback<MyClass, AnotherClass>(
* pointerToMyClassObject, * pointerToMyClassObject,
* &MyClass::myMethod * &MyClass::myMethod
* ) * )
* @endcode
*/ */
template<class T, typename S = void *> class Callback: public BaseCallback<S> { template<class T, typename S = void *> class Callback: public BaseCallback<S> {
protected: protected:
typedef void(T::*TMethod)(S); typedef void(T::*TMethod)(S);
T *_object; T *_object;
TMethod _method; ;
public: public:
Callback(T *object, TMethod method): _object(object), _method(method) {} Callback(T *object, TMethod method): _object(object), _method(method) {}
virtual ~Callback() {} virtual ~Callback() {}
void operator()(S data) { (_object->*_method)(data); } void operator()(S data) { (_object->*_method)(data); } /*!< Type of the object passed to the operator. */
}; };
/** /**
* CallbackBridge<T, OS, S> helps you to chain callbacks. * CallbackBridge<T, OS, S> allows you to chain callbacks.
* *
* CallbackBridge keeps a pointer to BaseCallback<OS>. * CallbackBridge keeps a pointer to BaseCallback<OS>.
* When its operator() is called, it passes this pointer * When its operator() is called, it passes this pointer
* along with the actual data (of type <S>) to the method * along with the actual data (of type \<S\>) to the method
* of <T> class. * of \<T\> class.
* *
* This is needed when you have to call a callback only * This is needed when you have to call a callback only
* when your own callback is called. So, your callback * when your own callback is called. So, your callback
@ -119,9 +120,9 @@ public:
* So, if you receive a BaseCallback<SomeClass> callback * So, if you receive a BaseCallback<SomeClass> callback
* and you want to call it from your MyClass::myMethod method, * and you want to call it from your MyClass::myMethod method,
* you should create CallbackBridge<MyClass, SomeClass, S>, * you should create CallbackBridge<MyClass, SomeClass, S>,
* where <S> is data type you want to receive in MyClass::myMethod. * where \<S\> is the data type you want to receive in MyClass::myMethod.
* *
* You create it similarly to this: * You can create it in the following way:
* new Callback<MyClass, SomeClass, AnotherClass>( * new Callback<MyClass, SomeClass, AnotherClass>(
* pointerToMyClassObject, * pointerToMyClassObject,
* &MyClass::myMethod, * &MyClass::myMethod,
@ -139,7 +140,7 @@ public:
CallbackBridge(T *object, TCallbackMethod method, BaseCallback<OS> *outerCallback): CallbackBridge(T *object, TCallbackMethod method, BaseCallback<OS> *outerCallback):
_object(object), _method(method), _outerCallback(outerCallback) {} _object(object), _method(method), _outerCallback(outerCallback) {}
virtual ~CallbackBridge() {} virtual ~CallbackBridge() {}
void operator()(S data) { (_object->*_method)(_outerCallback, data); } void operator()(S data) { (_object->*_method)(_outerCallback, data); } /*!< Type of the object passed to the operator. */
}; };
/** @} */ /** @} */

View file

@ -48,7 +48,7 @@ class SeekableReadStream;
* The (singleton) configuration manager, used to query & set configuration * The (singleton) configuration manager, used to query & set configuration
* values using string keys. * values using string keys.
* *
* @todo Implement the callback based notification system (outlined below) * TBD: Implement the callback based notification system (outlined below)
* which sends out notifications to interested parties whenever the value * which sends out notifications to interested parties whenever the value
* of some specific (or any) configuration key changes. * of some specific (or any) configuration key changes.
*/ */
@ -107,55 +107,64 @@ public:
static char const *const kCloudDomain; static char const *const kCloudDomain;
#endif #endif
void loadDefaultConfigFile(); void loadDefaultConfigFile(); /*!< Load the default configuration file. */
void loadConfigFile(const String &filename); void loadConfigFile(const String &filename); /*!< Load a specific configuration file. */
/** /**
* Retrieve the config domain with the given name. * Retrieve the config domain with the given name.
* @param domName the name of the domain to retrieve * @param domName Name of the domain to retrieve.
* @return pointer to the domain, or 0 if the domain doesn't exist. * @return Pointer to the domain, or 0 if the domain does not exist.
*/ */
Domain * getDomain(const String &domName); Domain * getDomain(const String &domName);
const Domain * getDomain(const String &domName) const; const Domain * getDomain(const String &domName) const; /*!< @overload */
// /**
// Generic access methods: No domain specified, use the values from the * @name Generic access methods
// various domains in the order of their priority. * @brief No domain specified, use the values from the
// * various domains in the order of their priority.
* @{
*/
bool hasKey(const String &key) const; bool hasKey(const String &key) const;
const String & get(const String &key) const; const String & get(const String &key) const;
void set(const String &key, const String &value); void set(const String &key, const String &value);
/** @} */
/** /**
* Update a configuration entry for the active domain and flush * Update a configuration entry for the active domain and flush
* the configuration file to disk if the value changed * the configuration file to disk if the value changed.
*/ */
void setAndFlush(const String &key, const Common::String &value); void setAndFlush(const String &key, const Common::String &value);
#if 1 #if 1
// /**
// Domain specific access methods: Acces *one specific* domain and modify it. * @name Domain-specific access methods
// TODO: I'd like to get rid of most of those if possible, or at least reduce * @brief Access one specific domain and modify it.
// their usage, by using getDomain as often as possible. For example in the *
// options dialog code... * TBD: Get rid of most of those if possible, or at least reduce
// * their usage, by using getDomain as often as possible. For example in the
* options dialog code.
* @{
*/
bool hasKey(const String &key, const String &domName) const; bool hasKey(const String &key, const String &domName) const;
const String & get(const String &key, const String &domName) const; const String & get(const String &key, const String &domName) const;
void set(const String &key, const String &value, const String &domName); void set(const String &key, const String &value, const String &domName);
void removeKey(const String &key, const String &domName); void removeKey(const String &key, const String &domName);
/** @} */
#endif #endif
// /**
// Some additional convenience accessors. * @name Additional convenience accessors
// * @{
int getInt(const String &key, const String &domName = String()) const; */
bool getBool(const String &key, const String &domName = String()) const;
void setInt(const String &key, int value, const String &domName = String()); int getInt(const String &key, const String &domName = String()) const; /*!< Get integer value. */
void setBool(const String &key, bool value, const String &domName = String()); bool getBool(const String &key, const String &domName = String()) const; /*!< Get Boolean value. */
void setInt(const String &key, int value, const String &domName = String()); /*!< Set integer value. */
void setBool(const String &key, bool value, const String &domName = String()); /*!< Set integer value. */
void registerDefault(const String &key, const String &value); void registerDefault(const String &key, const String &value);
@ -163,20 +172,20 @@ public:
void registerDefault(const String &key, int value); void registerDefault(const String &key, int value);
void registerDefault(const String &key, bool value); void registerDefault(const String &key, bool value);
void flushToDisk(); void flushToDisk(); /*!< Flush configuration to disk. */
void setActiveDomain(const String &domName); void setActiveDomain(const String &domName); /*!< Set the given domain as active. */
Domain * getActiveDomain() { return _activeDomain; } Domain * getActiveDomain() { return _activeDomain; } /*!< Get the active domain. */
const Domain * getActiveDomain() const { return _activeDomain; } const Domain * getActiveDomain() const { return _activeDomain; } /*!< @overload */
const String & getActiveDomainName() const { return _activeDomainName; } const String & getActiveDomainName() const { return _activeDomainName; } /*!< Get the name of the active domain. */
void addGameDomain(const String &domName); void addGameDomain(const String &domName); /*!< Add a new game domain. */
void removeGameDomain(const String &domName); void removeGameDomain(const String &domName); /*!< Remove a game domain. */
void renameGameDomain(const String &oldName, const String &newName); void renameGameDomain(const String &oldName, const String &newName); /*!< Rename a game domain. */
void addMiscDomain(const String &domName); void addMiscDomain(const String &domName); /*!< Add a miscellaneous domain. */
void removeMiscDomain(const String &domName); void removeMiscDomain(const String &domName); /*!< Remove a miscellaneous domain. */
void renameMiscDomain(const String &oldName, const String &newName); void renameMiscDomain(const String &oldName, const String &newName); /*!< Rename a miscellaneous domain. */
bool hasGameDomain(const String &domName) const; bool hasGameDomain(const String &domName) const;
bool hasMiscDomain(const String &domName) const; bool hasMiscDomain(const String &domName) const;
@ -187,7 +196,7 @@ public:
static void defragment(); // move in memory to reduce fragmentation static void defragment(); // move in memory to reduce fragmentation
void copyFrom(ConfigManager &source); void copyFrom(ConfigManager &source);
/** @} */
private: private:
friend class Singleton<SingletonBaseType>; friend class Singleton<SingletonBaseType>;
ConfigManager(); ConfigManager();

View file

@ -60,12 +60,12 @@ struct CoroBaseContext {
const char *_funcName; const char *_funcName;
#endif #endif
/** /**
* Creates a coroutine context * Create a coroutine context.
*/ */
CoroBaseContext(const char *func); CoroBaseContext(const char *func);
/** /**
* Destructor for coroutine context * Destructor for coroutine context.
*/ */
virtual ~CoroBaseContext(); virtual ~CoroBaseContext();
}; };
@ -74,7 +74,7 @@ typedef CoroBaseContext *CoroContext;
/** This is a special constant that can be temporarily used as a parameter to call coroutine-ised /** This is a special constant that can be temporarily used as a parameter to call coroutine-ised
* methods from code that haven't yet been converted to being a coroutine, so code at least * methods from code that have not yet been converted to being a coroutine, so code at least
* compiles correctly. Be aware, though, that an error will occur if a coroutine that was passed * compiles correctly. Be aware, though, that an error will occur if a coroutine that was passed
* the nullContext tries to sleep or yield control. * the nullContext tries to sleep or yield control.
*/ */
@ -82,9 +82,9 @@ extern CoroContext nullContext;
/** /**
* Wrapper class which holds a pointer to a pointer to a CoroBaseContext. * Wrapper class which holds a pointer to a pointer to a CoroBaseContext.
* The interesting part is the destructor, which kills the context being held, * Note that the destructor kills the context being held,
* but ONLY if the _sleep val of that context is zero. This way, a coroutine * but ONLY if the _sleep val of that context is zero. This way, a coroutine
* can just 'return' w/o having to worry about freeing the allocated context * can just 'return' without freeing the allocated context
* (in Simon Tatham's original code, one had to use a special macro to * (in Simon Tatham's original code, one had to use a special macro to
* return from a coroutine). * return from a coroutine).
*/ */
@ -104,30 +104,30 @@ public:
} }
}; };
/** Methods that have been converted to being a coroutine should have this as the first parameter */ /** Set this as the first parameter for methods that have been converted to being a coroutine. */
#define CORO_PARAM Common::CoroContext &coroParam #define CORO_PARAM Common::CoroContext &coroParam
/** /**
* Begin the declaration of a coroutine context. * Begin the declaration of a coroutine context.
* This allows declaring variables which are 'persistent' during the * This allows declaring variables which are 'persistent' during the
* lifetime of the coroutine. An example use would be: * lifetime of the coroutine. Example usage:
* * @code
* CORO_BEGIN_CONTEXT; * CORO_BEGIN_CONTEXT;
* int var; * int var;
* char *foo; * char *foo;
* CORO_END_CONTEXT(_ctx); * CORO_END_CONTEXT(_ctx);
* * @endcode
* It is not possible to initialize variables here, due to the way this * It is not possible to initialize variables here, due to the way this
* macro is implemented. Furthermore, to use the variables declared in * macro is implemented. Furthermore, to use the variables declared in
* the coroutine context, you have to access them via the context variable * the coroutine context, you must access them through the context variable
* name that was specified as parameter to CORO_END_CONTEXT, e.g. * name that was specified as a parameter to @c CORO_END_CONTEXT, e.g.
* _ctx->var = 0; * _ctx->var = 0;
* *
* @see CORO_END_CONTEXT * @see CORO_END_CONTEXT
* *
* @note We declare a variable 'DUMMY' to allow the user to specify an 'empty' * @note A 'DUMMY' variable is declared to allow the user to specify an 'empty'
* context, and so compilers won't complain about ";" following the macro. * context, and so that compilers do not complain about ";" following the macro.
*/ */
#define CORO_BEGIN_CONTEXT \ #define CORO_BEGIN_CONTEXT \
struct CoroContextTag : Common::CoroBaseContext { \ struct CoroContextTag : Common::CoroBaseContext { \
@ -136,15 +136,14 @@ public:
/** /**
* End the declaration of a coroutine context. * End the declaration of a coroutine context.
* @param x name of the coroutine context * @param x Name of the coroutine context.
* @see CORO_BEGIN_CONTEXT * @see CORO_BEGIN_CONTEXT
*/ */
#define CORO_END_CONTEXT(x) } *x = (CoroContextTag *)coroParam #define CORO_END_CONTEXT(x) } *x = (CoroContextTag *)coroParam
/** /**
* Begin the code section of a coroutine. * Begin the code section of a coroutine.
* @param x name of the coroutine context * @param x Name of the coroutine context.
* @see CORO_BEGIN_CODE
*/ */
#define CORO_BEGIN_CODE(x) \ #define CORO_BEGIN_CODE(x) \
if (&coroParam == &Common::nullContext) assert(!Common::nullContext); \ if (&coroParam == &Common::nullContext) assert(!Common::nullContext); \
@ -155,7 +154,6 @@ public:
/** /**
* End the code section of a coroutine. * End the code section of a coroutine.
* @see CORO_END_CODE
*/ */
#define CORO_END_CODE \ #define CORO_END_CODE \
if (&coroParam == &Common::nullContext) { \ if (&coroParam == &Common::nullContext) { \
@ -181,9 +179,9 @@ public:
/** /**
* Stop the currently running coroutine and all calling coroutines. * Stop the currently running coroutine and all calling coroutines.
* *
* This sets _sleep to -1 rather than 0 so that the context doesn't get * This sets _sleep to -1 rather than 0 so that the context does not get
* deleted by CoroContextHolder, since we want CORO_INVOKE_ARGS to * deleted by CoroContextHolder, since we want @ref CORO_INVOKE_ARGS to
* propogate the _sleep value and return immediately (the scheduler will * propagate the _sleep value and return immediately (the scheduler will
* then delete the entire coroutine's state, including all subcontexts). * then delete the entire coroutine's state, including all subcontexts).
*/ */
#define CORO_KILL_SELF() \ #define CORO_KILL_SELF() \
@ -191,8 +189,8 @@ public:
/** /**
* This macro is to be used in conjunction with CORO_INVOKE_ARGS and * Use this macro in conjunction with @ref CORO_INVOKE_ARGS and
* similar macros for calling coroutines-enabled subroutines. * similar macros for calling coroutine-enabled subroutines.
*/ */
#define CORO_SUBCTX coroParam->_subctx #define CORO_SUBCTX coroParam->_subctx
@ -206,10 +204,10 @@ public:
* If the subcontext is null, the coroutine ended normally, and we can * If the subcontext is null, the coroutine ended normally, and we can
* simply break out of the loop and continue execution. * simply break out of the loop and continue execution.
* *
* @param subCoro name of the coroutine-enabled function to invoke * @param subCoro Name of the coroutine-enabled function to invoke.
* @param ARGS list of arguments to pass to subCoro * @param ARGS List of arguments to pass to subCoro.
* *
* @note ARGS must be surrounded by parentheses, and the first argument * @note @p ARGS must be surrounded by parentheses, and the first argument
* in this list must always be CORO_SUBCTX. For example, the * in this list must always be CORO_SUBCTX. For example, the
* regular function call * regular function call
* myFunc(a, b); * myFunc(a, b);
@ -230,9 +228,9 @@ public:
} while (0) } while (0)
/** /**
* Invoke another coroutine. Similar to CORO_INVOKE_ARGS, * Invoke another coroutine. Similar to @ref CORO_INVOKE_ARGS,
* but allows specifying a return value which is returned * but allows specifying a return value which is returned
* if invoked coroutine yields (thus causing the current * if the invoked coroutine yields (thus causing the current
* coroutine to yield, too). * coroutine to yield, too).
*/ */
#define CORO_INVOKE_ARGS_V(subCoro, RESULT, ARGS) \ #define CORO_INVOKE_ARGS_V(subCoro, RESULT, ARGS) \
@ -249,14 +247,14 @@ public:
} while (0) } while (0)
/** /**
* Convenience wrapper for CORO_INVOKE_ARGS for invoking a coroutine * Convenience wrapper for @ref CORO_INVOKE_ARGS for invoking a coroutine
* with no parameters. * with no parameters.
*/ */
#define CORO_INVOKE_0(subCoroutine) \ #define CORO_INVOKE_0(subCoroutine) \
CORO_INVOKE_ARGS(subCoroutine, (CORO_SUBCTX)) CORO_INVOKE_ARGS(subCoroutine, (CORO_SUBCTX))
/** /**
* Convenience wrapper for CORO_INVOKE_ARGS for invoking a coroutine * Convenience wrapper for @ref CORO_INVOKE_ARGS for invoking a coroutine
* with one parameter. * with one parameter.
*/ */
#define CORO_INVOKE_1(subCoroutine, a0) \ #define CORO_INVOKE_1(subCoroutine, a0) \
@ -270,7 +268,7 @@ public:
CORO_INVOKE_ARGS(subCoroutine, (CORO_SUBCTX, a0, a1)) CORO_INVOKE_ARGS(subCoroutine, (CORO_SUBCTX, a0, a1))
/** /**
* Convenience wrapper for CORO_INVOKE_ARGS for invoking a coroutine * Convenience wrapper for @ref CORO_INVOKE_ARGS for invoking a coroutine
* with three parameters. * with three parameters.
*/ */
#define CORO_INVOKE_3(subCoroutine, a0,a1,a2) \ #define CORO_INVOKE_3(subCoroutine, a0,a1,a2) \
@ -285,10 +283,10 @@ public:
// the size of process specific info /** Size of process-specific information. */
#define CORO_PARAM_SIZE 32 #define CORO_PARAM_SIZE 32
// the maximum number of processes /** Maximum number of processes. */
#define CORO_NUM_PROCESS 100 #define CORO_NUM_PROCESS 100
#define CORO_MAX_PROCESSES 100 #define CORO_MAX_PROCESSES 100
#define CORO_MAX_PID_WAITING 5 #define CORO_MAX_PID_WAITING 5
@ -296,26 +294,26 @@ public:
#define CORO_INFINITE 0xffffffff #define CORO_INFINITE 0xffffffff
#define CORO_INVALID_PID_VALUE 0 #define CORO_INVALID_PID_VALUE 0
/** Coroutine parameter for methods converted to coroutines */ /** Coroutine parameter for methods converted to coroutines. */
typedef void (*CORO_ADDR)(CoroContext &, const void *); typedef void (*CORO_ADDR)(CoroContext &, const void *);
/** process structure */ /** process structure */
struct PROCESS { struct PROCESS {
PROCESS *pNext; ///< pointer to next process in active or free list PROCESS *pNext; ///< Pointer to the next process in an active or free list.
PROCESS *pPrevious; ///< pointer to previous process in active or free list PROCESS *pPrevious; ///< Pointer to the previous process in an active or free list.
CoroContext state; ///< the state of the coroutine CoroContext state; ///< State of the coroutine.
CORO_ADDR coroAddr; ///< the entry point of the coroutine CORO_ADDR coroAddr; ///< Entry point of the coroutine.
int sleepTime; ///< number of scheduler cycles to sleep int sleepTime; ///< Number of scheduler cycles to sleep.
uint32 pid; ///< process ID uint32 pid; ///< Process ID.
uint32 pidWaiting[CORO_MAX_PID_WAITING]; ///< Process ID(s) process is currently waiting on uint32 pidWaiting[CORO_MAX_PID_WAITING]; ///< Process ID(s) that the process is currently waiting on.
char param[CORO_PARAM_SIZE]; ///< process specific info char param[CORO_PARAM_SIZE]; ///< Process-specific information.
}; };
typedef PROCESS *PPROCESS; typedef PROCESS *PPROCESS;
/** Event structure */ /** Event structure. */
struct EVENT { struct EVENT {
uint32 pid; uint32 pid;
bool manualReset; bool manualReset;
@ -325,7 +323,7 @@ struct EVENT {
/** /**
* Creates and manages "processes" (really coroutines). * Create and manage "processes" (really coroutines).
*/ */
class CoroutineScheduler : public Singleton<CoroutineScheduler> { class CoroutineScheduler : public Singleton<CoroutineScheduler> {
public: public:
@ -336,42 +334,42 @@ private:
friend class Singleton<CoroutineScheduler>; friend class Singleton<CoroutineScheduler>;
/** /**
* Constructor * Constructor.
*/ */
CoroutineScheduler(); CoroutineScheduler();
/** /**
* Destructor * Destructor.
*/ */
~CoroutineScheduler(); ~CoroutineScheduler();
/** list of all processes */ /** List of all processes. */
PROCESS *processList; PROCESS *processList;
/** active process list - also saves scheduler state */ /** Active process list. Saves scheduler state. */
PROCESS *active; PROCESS *active;
/** pointer to free process list */ /** Pointer to the free process list. */
PROCESS *pFreeProcesses; PROCESS *pFreeProcesses;
/** the currently active process */ /** Currently active process. */
PROCESS *pCurrent; PROCESS *pCurrent;
/** Auto-incrementing process Id */ /** Auto-incrementing process ID. */
int pidCounter; int pidCounter;
/** Event list */ /** Event list. */
Common::List<EVENT *> _events; Common::List<EVENT *> _events;
#ifdef DEBUG #ifdef DEBUG
// diagnostic process counters /** Diagnostic process counters. */
int numProcs; int numProcs;
int maxProcs; int maxProcs;
/** /**
* Checks both the active and free process list to insure all the links are valid, * Check both the active and free process list to ensure that all links are valid,
* and that no processes have been lost * and that no processes have been lost.
*/ */
void checkStack(); void checkStack();
#endif #endif
@ -386,24 +384,24 @@ private:
EVENT *getEvent(uint32 pid); EVENT *getEvent(uint32 pid);
public: public:
/** /**
* Kills all processes and places them on the free list. * Kill all processes and place them on the free list.
*/ */
void reset(); void reset();
#ifdef DEBUG #ifdef DEBUG
/** /**
* Shows the maximum number of process used at once. * Show the maximum number of processes used at once.
*/ */
void printStats(); void printStats();
#endif #endif
/** /**
* Give all active processes a chance to run * Give all active processes a chance to run.
*/ */
void schedule(); void schedule();
/** /**
* Reschedules all the processes to run again this tick * Reschedule all processes to run again this tick.
*/ */
void rescheduleAll(); void rescheduleAll();
@ -414,151 +412,155 @@ public:
void reschedule(PPROCESS pReSchedProc = nullptr); void reschedule(PPROCESS pReSchedProc = nullptr);
/** /**
* Moves the specified process to the end of the dispatch queue * Move the specified process to the end of the dispatch queue
* allowing it to run again within the current game cycle. * allowing it to run again within the current game cycle.
* @param pGiveProc Which process * @param pReSchedProc The process to move.
*/ */
void giveWay(PPROCESS pReSchedProc = nullptr); void giveWay(PPROCESS pReSchedProc = nullptr);
/** /**
* Continously makes a given process wait for another process to finish or event to signal. * Continously make a given process wait for another process to finish or event to signal.
* *
* @param pid Process/Event identifier * @param pid Process/Event identifier.
* @param duration Duration in milliseconds * @param duration Duration in milliseconds.
* @param expired If specified, set to true if delay period expired * @param expired If specified, set to true if the delay period expired.
*/ */
void waitForSingleObject(CORO_PARAM, int pid, uint32 duration, bool *expired = nullptr); void waitForSingleObject(CORO_PARAM, int pid, uint32 duration, bool *expired = nullptr);
/** /**
* Continously makes a given process wait for given prcesses to finished or events to be set * Continously make a given process wait for given processes to finish or events to be set.
* *
* @param nCount Number of Id's being passed * @param nCount Number of IDs being passed.
* @param evtList List of pids to wait for * @param pidList List of process IDs to wait for.
* @param bWaitAll Specifies whether all or any of the processes/events * @param bWaitAll Whether to wait for all or any of the processes/events.
* @param duration Duration in milliseconds * @param duration Duration in milliseconds.
* @param expired Set to true if delay period expired * @param expired Set to true if the delay period expired.
*/ */
void waitForMultipleObjects(CORO_PARAM, int nCount, uint32 *pidList, bool bWaitAll, void waitForMultipleObjects(CORO_PARAM, int nCount, uint32 *pidList, bool bWaitAll,
uint32 duration, bool *expired = nullptr); uint32 duration, bool *expired = nullptr);
/** /**
* Make the active process sleep for the given duration in milliseconds * Make the active process sleep for the given duration in milliseconds.
* *
* @param duration Duration in milliseconds * @param duration Duration in milliseconds
* @remarks This duration won't be precise, since it relies on the frequency the * @remarks This duration is not precise, since it relies on the frequency the
* scheduler is called. * scheduler is called.
*/ */
void sleep(CORO_PARAM, uint32 duration); void sleep(CORO_PARAM, uint32 duration);
/** /**
* Creates a new process. * Create a new process.
* *
* @param pid process identifier * @param pid Process identifier.
* @param coroAddr Coroutine start address * @param coroAddr Coroutine start address.
* @param pParam Process specific info * @param pParam Process-specific information.
* @param sizeParam Size of process specific info * @param sizeParam Size of the process-specific information.
*/ */
PROCESS *createProcess(uint32 pid, CORO_ADDR coroAddr, const void *pParam, int sizeParam); PROCESS *createProcess(uint32 pid, CORO_ADDR coroAddr, const void *pParam, int sizeParam);
/** /**
* Creates a new process with an auto-incrementing Process Id. * Create a new process with an auto-incrementing Process ID.
* *
* @param coroAddr Coroutine start address * @param coroAddr Coroutine start address.
* @param pParam Process specific info * @param pParam Process-specific information.
* @param sizeParam Size of process specific info * @param sizeParam Size of process-specific information.
*/ */
uint32 createProcess(CORO_ADDR coroAddr, const void *pParam, int sizeParam); uint32 createProcess(CORO_ADDR coroAddr, const void *pParam, int sizeParam);
/** /**
* Creates a new process with an auto-incrementing Process Id, and a single pointer parameter. * Create a new process with an auto-incrementing Process ID and a single pointer parameter.
* *
* @param coroAddr Coroutine start address * @param coroAddr Coroutine start address.
* @param pParam Process specific info * @param pParam Process-specific information.
*/ */
uint32 createProcess(CORO_ADDR coroAddr, const void *pParam); uint32 createProcess(CORO_ADDR coroAddr, const void *pParam);
/** /**
* Kills the specified process. * Kill the specified process.
* *
* @param pKillProc Which process to kill * @param pKillProc The process to kill.
*/ */
void killProcess(PROCESS *pKillProc); void killProcess(PROCESS *pKillProc);
/** /**
* Returns a pointer to the currently running process. * Return a pointer to the currently running process.
*/ */
PROCESS *getCurrentProcess(); PROCESS *getCurrentProcess();
/** /**
* Returns the process identifier of the currently running process. * Return the process identifier of the currently running process.
*/ */
int getCurrentPID() const; int getCurrentPID() const;
/** /**
* Kills any process matching the specified PID. The current * Kill any process matching the specified PID. The current
* process cannot be killed. * process cannot be killed.
* *
* @param pidKill Process identifier of process to kill * @param pidKill Process identifier of the process to kill.
* @param pidMask Mask to apply to process identifiers before comparison * @param pidMask Mask to apply to process identifiers before comparison.
* @return The number of processes killed is returned. * @return The number of processes killed.
*/ */
int killMatchingProcess(uint32 pidKill, int pidMask = -1); int killMatchingProcess(uint32 pidKill, int pidMask = -1);
/** /**
* Set pointer to a function to be called by killProcess(). * Set pointer to a function to be called by killProcess().
* *
* May be called by a resource allocator, the function supplied is * May be called by a resource allocator. The function supplied is
* called by killProcess() to allow the resource allocator to free * called by killProcess() to allow the resource allocator to free
* resources allocated to the dying process. * resources allocated to the dying process.
* *
* @param pFunc Function to be called by killProcess() * @param pFunc Function to be called by killProcess().
*/ */
void setResourceCallback(VFPTRPP pFunc); void setResourceCallback(VFPTRPP pFunc);
/* Event methods */ /** @name Event methods
* @{
*/
/** /**
* Creates a new event (semaphore) object * Create a new event (semaphore) object.
* *
* @param bManualReset Events needs to be manually reset. Otherwise, * @param bManualReset Events needs to be manually reset. Otherwise,
* events will be automatically reset after a * events will be automatically reset after a
* process waits on the event finishes * process waits for the event to finish.
* @param bInitialState Specifies whether the event is signalled or not * @param bInitialState Specifies whether the event is signalled or not
* initially * initially.
*/ */
uint32 createEvent(bool bManualReset, bool bInitialState); uint32 createEvent(bool bManualReset, bool bInitialState);
/** /**
* Destroys the given event * Destroy the given event.
* @param pidEvent Event Process Id * @param pidEvent Event Process ID.
*/ */
void closeEvent(uint32 pidEvent); void closeEvent(uint32 pidEvent);
/** /**
* Sets the event * Set the event.
* @param pidEvent Event Process Id * @param pidEvent Event Process ID.
*/ */
void setEvent(uint32 pidEvent); void setEvent(uint32 pidEvent);
/** /**
* Resets the event * Reset the event.
* @param pidEvent Event Process Id * @param pidEvent Event Process ID.
*/ */
void resetEvent(uint32 pidEvent); void resetEvent(uint32 pidEvent);
/** /**
* Temporarily sets a given event to true, and then runs all waiting * Temporarily set a given event to true, and then run all waiting
* processes,allowing any processes waiting on the event to be fired. It * processes, allowing any processes waiting on the event to be fired. It
* then immediately resets the event again. * then immediately resets the event again.
* *
* @param pidEvent Event Process Id * @param pidEvent Event Process ID.
* *
* @remarks Should not be run inside of another process * @remarks Should not be run inside of another process.
*/ */
void pulseEvent(uint32 pidEvent); void pulseEvent(uint32 pidEvent);
}; };
/** @} */ /** @} */
/** @} */
} // end of namespace Common } // end of namespace Common
#endif // COMMON_COROUTINES_H #endif // COMMON_COROUTINES_H

View file

@ -37,15 +37,15 @@ namespace Common {
class CosineTable { class CosineTable {
public: public:
/** /**
* Construct a cosine table given the number of points * Construct a cosine table given the number of points.
* *
* @param nPoints Number of distinct radian points, which must be in range [16,65536] and be divisible by 4 * @param nPoints Number of distinct radian points that must be in range [16,65536] and be divisible by 4.
*/ */
CosineTable(int nPoints); CosineTable(int nPoints);
~CosineTable(); ~CosineTable();
/** /**
* Get pointer to table. * Get a pointer to a table.
* *
* This table contains nPoints/2 entries. * This table contains nPoints/2 entries.
* Prefer to use at() * Prefer to use at()
@ -58,9 +58,9 @@ public:
const float *getTable() { return _tableEOS; } const float *getTable() { return _tableEOS; }
/** /**
* Returns cos(2*pi * index / nPoints ) * Return cos(2*pi * index / nPoints )
* Index must be in range [0, nPoints - 1] * Index must be in range [0, nPoints - 1]
* Faster than atLegacy * Faster than atLegacy.
*/ */
float at(int index) const; float at(int index) const;

View file

@ -20,11 +20,6 @@
* *
*/ */
/**
*
*/
#ifndef COMMON_DCL_H #ifndef COMMON_DCL_H
#define COMMON_DCL_H #define COMMON_DCL_H
@ -36,14 +31,13 @@ namespace Common {
* @defgroup common_dcl Data compression library * @defgroup common_dcl Data compression library
* @ingroup common * @ingroup common
* *
* @brief PKWARE data compression library. * @brief PKWARE data compression library (DCL).
* *
* @details PKWARE DCL ("explode") ("PKWARE data compression library") decompressor used in engines: * @details PKWARE DCL ("explode") ("PKWARE data compression library") decompressor used in engines:
* - agos (exclusively for Simon 2 setup.shr file) * - AGOS (exclusively for Simon 2 setup.shr file)
* - mohawk * - Mohawk
* - neverhood * - Neverhood
* - sci * - SCI
*
* @{ * @{
*/ */
@ -51,20 +45,29 @@ class ReadStream;
class SeekableReadStream; class SeekableReadStream;
/** /**
* Try to decompress a PKWARE DCL (PKWARE data compression library) compressed stream. Returns true if * Decompress a PKWARE DCL compressed stream.
* successful. *
* @return Returns true if successful.
*/ */
bool decompressDCL(ReadStream *sourceStream, byte *dest, uint32 packedSize, uint32 unpackedSize); bool decompressDCL(ReadStream *sourceStream, byte *dest, uint32 packedSize, uint32 unpackedSize);
/** /**
* Try to decompress a PKWARE DCL (PKWARE data compression library) compressed stream. Returns a valid pointer * @overload
* if successful and 0 otherwise. *
* Decompress a PKWARE DCL compressed stream.
*
* @return Returns a valid pointer if successful or 0 otherwise.
*/ */
SeekableReadStream *decompressDCL(SeekableReadStream *sourceStream, uint32 packedSize, uint32 unpackedSize); SeekableReadStream *decompressDCL(SeekableReadStream *sourceStream, uint32 packedSize, uint32 unpackedSize);
/** /**
* Try to decompress a PKWARE DCL (PKWARE data compression library) compressed stream. Returns a valid pointer * @overload
* if successful and 0 otherwise. This method is meant for cases, where the unpacked size is not known. *
* Decompress a PKWARE DCL compressed stream.
*
* This method is meant for cases, where the unpacked size is not known.
*
* @return Returns a valid pointer if successful or 0 otherwise.
*/ */
SeekableReadStream *decompressDCL(SeekableReadStream *sourceStream); SeekableReadStream *decompressDCL(SeekableReadStream *sourceStream);

View file

@ -50,7 +50,7 @@ namespace Common {
* (Inverse) Discrete Cosine Transforms. * (Inverse) Discrete Cosine Transforms.
* *
* Used in engines: * Used in engines:
* - scumm * - Scumm
*/ */
class DCT { class DCT {
public: public:

View file

@ -36,10 +36,9 @@ namespace Common {
/** /**
* @defgroup common_debug_channels Debug channels * @defgroup common_debug_channels Debug channels
* @ingroup common_debug * @ingroup common
* *
* @brief Functions for managing debug channels. * @brief Functions for managing debug channels.
*
* @{ * @{
*/ */
@ -52,68 +51,69 @@ public:
DebugChannel(uint32 c, const String &n, const String &d) DebugChannel(uint32 c, const String &n, const String &d)
: name(n), description(d), channel(c), enabled(false) {} : name(n), description(d), channel(c), enabled(false) {}
String name; String name; /*!< Name of the channel */
String description; String description; /*!< Description of the channel */
uint32 channel; uint32 channel; /*!< Channel number. */
bool enabled; bool enabled; /*!< Whether the channel is enabled. */
}; };
/** /**
* Adds a debug channel. * Add a debug channel.
* *
* A debug channel is considered roughly similar to what our debug levels described by * A debug channel is considered roughly similar to what the debug levels described by
* gDebugLevel try to achieve: * gDebugLevel try to achieve:
* *
* Debug channels should only affect the display of additional debug output, based on * Debug channels should only affect the display of additional debug output, based on
* their state. That is if they are enabled, channel specific debug messages should * their state. That is, if they are enabled, channel-specific debug messages should
* be shown. If they are disabled on the other hand, those messages will be hidden. * be shown. If they are disabled on the other hand, those messages will be hidden.
* *
* @see gDebugLevel. * @see gDebugLevel
* *
* Note that we have debug* functions which depend both on the debug level set and * Note that we have debug* functions that depend both on the debug level set and
* specific debug channels. Those functions will only show output, when *both* criteria * specific debug channels. Those functions will only show output, when *both* criteria
* are satisfied. * are satisfied.
* *
* @param channel the channel flag (should be OR-able i.e. first one should be 1 then 2, 4, etc.) * @param channel Channel flag (should be OR-able i.e. first one should be 1 then 2, 4, etc.).
* @param name the option name which is used in the debugger/on the command line to enable * @param name The option name that is used in the debugger/on the command line to enable
* this special debug level (case will be ignored) * this special debug level (case will be ignored).
* @param description the description which shows up in the debugger * @param description The description that shows up in the debugger.
* @return true on success false on failure *
* @return True on success, false on failure.
*/ */
bool addDebugChannel(uint32 channel, const String &name, const String &description); bool addDebugChannel(uint32 channel, const String &name, const String &description);
/** /**
* Resets all engine specific debug channels. * Reset all engine-specific debug channels.
*/ */
void clearAllDebugChannels(); void clearAllDebugChannels();
/** /**
* Enables a debug channel. * Enable a debug channel.
* *
* @param name the name of the debug channel to enable * @param name Name of the debug channel to enable.
* @return true on success, false on failure * @return True on success, false on failure.
*/ */
bool enableDebugChannel(const String &name); bool enableDebugChannel(const String &name);
/** /**
* Enables a debug channel. * @overload enableDebugChannel(uint32 channel)
* *
* @param channel The debug channel * @param channel Debug channel.
* @return true on success, false on failure * @return True on success, false on failure.
*/ */
bool enableDebugChannel(uint32 channel); bool enableDebugChannel(uint32 channel);
/** /**
* Disables a debug channel. * Disable a debug channel.
* *
* @param name the name of the debug channel to disable * @param name Name of the debug channel to disable.
* @return true on success, false on failure * @return True on success, false on failure.
*/ */
bool disableDebugChannel(const String &name); bool disableDebugChannel(const String &name);
/** /**
* Disables a debug channel. * @overload bool disableDebugChannel(uint32 channel)
* *
* @param channel The debug channel * @param channel The debug channel
* @return true on success, false on failure * @return true on success, false on failure
@ -154,7 +154,7 @@ private:
DebugManager() : gDebugChannelsEnabled(0) {} DebugManager() : gDebugChannelsEnabled(0) {}
}; };
/** Shortcut for accessing the debug manager. */ /** Shortcut for accessing the Debug Manager. */
#define DebugMan Common::DebugManager::instance() #define DebugMan Common::DebugManager::instance()
/** @} */ /** @} */

View file

@ -42,8 +42,7 @@ inline void debugCN(uint32 debugChannels, const char *s, ...) {}
* @defgroup common_debug Debug functions * @defgroup common_debug Debug functions
* @ingroup common * @ingroup common
* *
* @brief Debug functions. * @brief Functions for printing debug messages.
*
* @{ * @{
*/ */
@ -118,28 +117,29 @@ void debugCN(uint32 debugChannels, const char *s, ...) GCC_PRINTF(2, 3);
#endif #endif
/** /**
* Returns true if the debug level is set to the specified level * Check whether the debug level is set to the specified level.
*/ */
bool debugLevelSet(int level); bool debugLevelSet(int level);
/** /**
* Returns true if the debug level and channel are active * Check whether the debug level and channel are active.
* *
* @param level debug level to check against. If set to -1, only channel check is active * @param level Debug level to check against. If set to -1, only channel check is active.
* @param debugChannels Debug channel to check against.
* @see enableDebugChannel * @see enableDebugChannel
*/ */
bool debugChannelSet(int level, uint32 debugChannels); bool debugChannelSet(int level, uint32 debugChannels);
/** /**
* The debug level. Initially set to -1, indicating that no debug output * The debug level. Initially set to -1, indicating that no debug output
* should be shown. Positive values usually imply an increasing number of * should be shown. Positive values usually imply that an increasing number of
* debug output shall be generated, the higher the value, the more verbose the * debug output shall be generated. The higher the value, the more verbose the
* information (although the exact semantics are up to the engines). * information (although the exact semantics are up to the engines).
*/ */
extern int gDebugLevel; extern int gDebugLevel;
/** /**
* Specify if we want to show only the debug channels and suppress * Specify whether to show only the debug channels and suppress
* the non-channeled output. * the non-channeled output.
* *
* This option is useful when you want to have higher levels of channels * This option is useful when you want to have higher levels of channels
@ -147,7 +147,7 @@ extern int gDebugLevel;
*/ */
extern bool gDebugChannelsOnly; extern bool gDebugChannelsOnly;
//Global constant for EventRecorder debug channel /** Global constant for EventRecorder debug channel. */
enum GlobalDebugLevels { enum GlobalDebugLevels {
kDebugLevelEventRec = 1 << 30 kDebugLevelEventRec = 1 << 30
}; };