Sirikata
|
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_