Sirikata
libcore/include/sirikata/core/options/Options.hpp
Go to the documentation of this file.
00001 /*  Sirikata Configuration Options -- Sirikata Options
00002  *  Options.hpp
00003  *
00004  *  Copyright (c) 2009, Daniel Reiter Horn
00005  *  All rights reserved.
00006  *
00007  *  Redistribution and use in source and binary forms, with or without
00008  *  modification, are permitted provided that the following conditions are
00009  *  met:
00010  *  * Redistributions of source code must retain the above copyright
00011  *    notice, this list of conditions and the following disclaimer.
00012  *  * Redistributions in binary form must reproduce the above copyright
00013  *    notice, this list of conditions and the following disclaimer in
00014  *    the documentation and/or other materials provided with the
00015  *    distribution.
00016  *  * Neither the name of Sirikata nor the names of its contributors may
00017  *    be used to endorse or promote products derived from this software
00018  *    without specific prior written permission.
00019  *
00020  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
00021  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
00022  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00023  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
00024  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00025  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00026  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00027  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00028  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00029  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00030  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00031  */
00032 
00033 #ifndef _SIRIKATA_OPTIONS_HPP_
00034 #define _SIRIKATA_OPTIONS_HPP_
00035 
00036 #include <sirikata/core/util/Platform.hpp>
00037 
00038 namespace Sirikata {
00039 
00040 #define GLOBAL_OPTIONS_MODULE ""
00041 #define SIRIKATA_OPTIONS_MODULE "sirikata"
00042 
00046 class SIRIKATA_EXPORT InitializeClassOptions{
00047 public:
00049     InitializeClassOptions(const char *,const void * thus,...);
00050     static InitializeClassOptions module(const char* module);
00051 
00052     InitializeClassOptions addOption(OptionValue* opt_value);
00053 protected:
00054     InitializeClassOptions(OptionSet* opt_set);
00055 
00056     OptionSet* mOptionSet;
00057 };
00061 class SIRIKATA_EXPORT InitializeGlobalOptions :public InitializeClassOptions{
00062 public:
00064     InitializeGlobalOptions(const char *,...);
00065 };
00070 class SIRIKATA_EXPORT OptionSet {
00071     std::map<std::string,OptionValue*> mNames;
00072     friend class InitializeGlobalOptions;
00073     friend class InitializeClassOptions;
00074     void addOptionNoLock(OptionValue*);
00075     static OptionSet*getOptionsNoLock(const std::string&s,const void * context);
00076     OptionValue* referenceOptionNoLock(const std::string &option, OptionValue**pointer);
00077     class OptionNameAndContext {
00078         const void * mContext;
00079         std::string mName;
00080     public:
00081         OptionNameAndContext(const std::string&nam,const void *con) {
00082             mContext=con;
00083             mName=nam;
00084         }
00085         bool operator<(const OptionNameAndContext&other)const {
00086             if (other.mContext==mContext) return mName<other.mName;
00087             return other.mContext<mContext;
00088         }
00089     };
00090     enum ParsingStage {
00091         PARSED_NO_OPTIONS,
00092         PARSED_BLANK_OPTIONS,
00093         PARSED_UNBLANK_OPTIONS,
00094         PARSED_PARTIAL_UNBLANK_OPTIONS
00095     } mParsingStage;
00096     bool initializationSet(OptionValue* thus, const OptionValue&other);
00097 public:
00098 
00099     OptionSet();
00100     ~OptionSet();
00101     void parse(const std::string&, bool use_defaults = true, bool missing_only = false, bool allow_unregistered = false);
00102     void parse(int, const char * const *, bool use_defaults = true, bool missing_only = false, bool allow_unregistered = false);
00103     void parseFile(const std::string&, bool required, bool use_defaults = true, bool missing_only = false, bool allow_unregistered = false);
00107     void fillMissingDefaults();
00108     void addOption(OptionValue*v);
00109     OptionValue* referenceOption(const std::string &option, OptionValue**pointer = NULL);
00110     static OptionValue* referenceOption(const std::string& module, const std::string &option, OptionValue**pointer=NULL);
00111     static OptionValue* referenceOption(const std::string& module, const void * context_ptr, const std::string &option, OptionValue**pointer=NULL);
00112     class StringVoid {
00113         String s;
00114         const void * v;
00115     public:
00116         StringVoid(const String &ss,const void*vv) {s=ss;v=vv;}
00117         bool operator < (const StringVoid&other) const {return (s==other.s?v<other.v:s<other.s);}
00118         bool operator == (const StringVoid&other) const {return (s==other.s&&v==other.v);}
00119     };
00120     static std::map<StringVoid,OptionSet*>* optionSets() {
00121         static std::map<StringVoid,OptionSet*>*retval=new std::map<StringVoid,OptionSet*>();
00122         return retval;
00123     }
00124     static OptionSet*getOptions(const std::string&s, const void *context);
00125     static OptionSet*getOptions(const std::string&s);
00126     static OptionSet*getOptions();
00127 };
00128 }
00129 
00130 /*example options
00131 extern OptionValue * SHIELD_ENERGY=NULL;
00132 static InitializeOptions o("",
00133                            addOption("ShieldOption",2,"Sets the awesome option",&SHIELD_ENERGY),
00134                            addOption("server",IPAddress(127,0,0,1,24)),
00135                            addOption("client",IPAddress(127,0,0,1,24)),
00136                            addOption("server",IPAddress(127,0,0,1,24)),
00137                            addOption("server",IPAddress(127,0,0,1,24))
00138                            NULL);
00139 extern OptionValue SHIELD_OPTION = referenceOption(CURRENT_MODULE,"ShieldOption");
00140 */
00141 
00142 #endif //_SIRIKATA_OPTIONS_HPP_