OgreStringInterface.h

Go to the documentation of this file.
00001 /*
00002 -----------------------------------------------------------------------------
00003 This source file is part of OGRE
00004     (Object-oriented Graphics Rendering Engine)
00005 For the latest info, see http://www.ogre3d.org/
00006 
00007 Copyright (c) 2000-2012 Torus Knot Software Ltd
00008 
00009 Permission is hereby granted, free of charge, to any person obtaining a copy
00010 of this software and associated documentation files (the "Software"), to deal
00011 in the Software without restriction, including without limitation the rights
00012 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00013 copies of the Software, and to permit persons to whom the Software is
00014 furnished to do so, subject to the following conditions:
00015 
00016 The above copyright notice and this permission notice shall be included in
00017 all copies or substantial portions of the Software.
00018 
00019 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00020 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00021 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00022 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00023 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00024 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00025 THE SOFTWARE.
00026 -----------------------------------------------------------------------------
00027 */
00028 
00029 #ifndef __StringInterface_H__
00030 #define __StringInterface_H__
00031 
00032 #include "OgrePrerequisites.h"
00033 #include "OgreString.h"
00034 #include "OgreCommon.h"
00035 
00036 namespace Ogre {
00037 
00045 
00046     enum ParameterType
00047     {
00048         PT_BOOL,
00049         PT_REAL,
00050         PT_INT,
00051         PT_UNSIGNED_INT,
00052         PT_SHORT,
00053         PT_UNSIGNED_SHORT,
00054         PT_LONG,
00055         PT_UNSIGNED_LONG,
00056         PT_STRING,
00057         PT_VECTOR3,
00058         PT_MATRIX3,
00059         PT_MATRIX4,
00060         PT_QUATERNION,
00061         PT_COLOURVALUE
00062     };
00063 
00065     class _OgreExport ParameterDef
00066     {
00067     public:
00068         String name;
00069         String description;
00070         ParameterType paramType;
00071         ParameterDef(const String& newName, const String& newDescription, ParameterType newType)
00072             : name(newName), description(newDescription), paramType(newType) {}
00073     };
00074     typedef vector<ParameterDef>::type ParameterList;
00075 
00077     class _OgreExport ParamCommand
00078     {
00079     public:
00080         virtual String doGet(const void* target) const = 0;
00081         virtual void doSet(void* target, const String& val) = 0;
00082 
00083         virtual ~ParamCommand() { }
00084     };
00085     typedef map<String, ParamCommand* >::type ParamCommandMap;
00086 
00088     class _OgreExport ParamDictionary
00089     {
00090         friend class StringInterface;
00091     protected:
00093         ParameterList mParamDefs;
00094 
00096         ParamCommandMap mParamCommands;
00097 
00099         ParamCommand* getParamCommand(const String& name)
00100         {
00101             ParamCommandMap::iterator i = mParamCommands.find(name);
00102             if (i != mParamCommands.end())
00103             {
00104                 return i->second;
00105             }
00106             else
00107             {
00108                 return 0;
00109             }
00110         }
00111 
00112         const ParamCommand* getParamCommand(const String& name) const
00113         {
00114             ParamCommandMap::const_iterator i = mParamCommands.find(name);
00115             if (i != mParamCommands.end())
00116             {
00117                 return i->second;
00118             }
00119             else
00120             {
00121                 return 0;
00122             }
00123         }
00124     public:
00125         ParamDictionary()  {}
00132         void addParameter(const ParameterDef& paramDef, ParamCommand* paramCmd)
00133         {
00134             mParamDefs.push_back(paramDef);
00135             mParamCommands[paramDef.name] = paramCmd;
00136         }
00142         const ParameterList& getParameters(void) const
00143         {
00144             return mParamDefs;
00145         }
00146 
00147 
00148 
00149     };
00150     typedef map<String, ParamDictionary>::type ParamDictionaryMap;
00151     
00161     class _OgreExport StringInterface 
00162     {
00163     private:
00164         OGRE_STATIC_MUTEX( msDictionaryMutex )
00165 
00166         
00167         static ParamDictionaryMap msDictionary;
00168 
00170         String mParamDictName;
00171         ParamDictionary* mParamDict;
00172 
00173     protected:
00184         bool createParamDictionary(const String& className)
00185         {
00186             OGRE_LOCK_MUTEX( msDictionaryMutex )
00187 
00188             ParamDictionaryMap::iterator it = msDictionary.find(className);
00189 
00190             if ( it == msDictionary.end() )
00191             {
00192                 mParamDict = &msDictionary.insert( std::make_pair( className, ParamDictionary() ) ).first->second;
00193                 mParamDictName = className;
00194                 return true;
00195             }
00196             else
00197             {
00198                 mParamDict = &it->second;
00199                 mParamDictName = className;
00200                 return false;
00201             }
00202         }
00203 
00204     public:
00205         StringInterface() : mParamDict(NULL) { }
00206 
00208         virtual ~StringInterface() {}
00209 
00217         ParamDictionary* getParamDictionary(void)
00218         {
00219             return mParamDict;
00220         }
00221 
00222         const ParamDictionary* getParamDictionary(void) const
00223         {
00224             return mParamDict;
00225         }
00226 
00232         const ParameterList& getParameters(void) const;
00233 
00248         virtual bool setParameter(const String& name, const String& value);
00258         virtual void setParameterList(const NameValuePairList& paramList);
00270         virtual String getParameter(const String& name) const
00271         {
00272             // Get dictionary
00273             const ParamDictionary* dict = getParamDictionary();
00274 
00275             if (dict)
00276             {
00277                 // Look up command object
00278                 const ParamCommand* cmd = dict->getParamCommand(name);
00279 
00280                 if (cmd)
00281                 {
00282                     return cmd->doGet(this);
00283                 }
00284             }
00285 
00286             // Fallback
00287             return "";
00288         }
00301         virtual void copyParametersTo(StringInterface* dest) const
00302         {
00303             // Get dictionary
00304             const ParamDictionary* dict = getParamDictionary();
00305 
00306             if (dict)
00307             {
00308                 // Iterate through own parameters
00309                 ParameterList::const_iterator i;
00310             
00311                 for (i = dict->mParamDefs.begin(); 
00312                 i != dict->mParamDefs.end(); ++i)
00313                 {
00314                     dest->setParameter(i->name, getParameter(i->name));
00315                 }
00316             }
00317 
00318 
00319         }
00320 
00324         static void cleanupDictionary () ;
00325 
00326     };
00327 
00332 }
00333 
00334 #endif
00335 

Copyright © 2012 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Fri May 25 23:36:28 2012