Subversion Repositories AndroidProjects

Rev

Blame | Last modification | View Log | RSS feed

#ifndef __MODVAL_H__
#define __MODVAL_H__

#include <string>

/*
 This module allows for dynamic modification of integer and floating-point
 constants at run-time.

 Place the M() around values you want to allow to be changed at run-time.
 When you want to modify a value, simply change the value in the source
 code file and call ReparseModValues() within your program to re-read the
 source files, checking for changes in constants.  Your program will need
 to contain some trigger such as a key combination to trigger the
 ReparseModValues() call.

 Example:
        x = x + M(2.1);

 Caveats:
        This module determines which files to parse through (during
        ReparseModValues()) at run-time, so if a M() macro has not yet been
        executed within a particular source file, its value will not be
        updated.

 Performance:
        There a small setup cost the first time each M() value is accessed
        after program startup and reparsing, but after that there is just the
        tiny overhead of a function call and a few vector dereferences.

 */


namespace Sexy
{

#if defined(SEXY_DISABLE_MODVAL) || defined(RELEASEFINAL)
#define M(val)  (val)
#define M1(val) (val)
#define M2(val) (val)
#define M3(val) (val)
#define M4(val) (val)
#define M5(val) (val)
#define M6(val) (val)
#define M7(val) (val)
#define M8(val) (val)
#define M9(val) (val)
#else
#define MODVAL_STR_COUNTER2(x,y,z) x#y","#z
#define MODVAL_STR_COUNTER1(x,y,z) MODVAL_STR_COUNTER2(x,y,z)
#define MODVAL_STR_COUNTER(x) MODVAL_STR_COUNTER1(x,__COUNTER__,__LINE__)
#define M(val) ModVal(0, MODVAL_STR_COUNTER("SEXY_SEXYMODVAL"__FILE__), (val))
#define M1(val) M(val)
#define M2(val) M(val)
#define M3(val) M(val)
#define M4(val) M(val)
#define M5(val) M(val)
#define M6(val) M(val)
#define M7(val) M(val)
#define M8(val) M(val)
#define M9(val) M(val)
#endif

int                             ModVal(int theAreaNum, const char* theFileName, int theInt);
double                  ModVal(int theAreaNum, const char* theFileName, double theDouble);
float                   ModVal(int theAreaNum, const char* theFileName, float theFloat);
const char*             ModVal(int theAreaNum, const char* theFileName, const char *theStr);
bool                    ReparseModValues();
void                    AddModValEnum(const std::string &theEnumName, int theVal);

}

#endif //__MODVAL_H__