/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2005 Robert Osfield * * This library is open source and may be redistributed and/or modified under * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * OpenSceneGraph Public License for more details. */ //osgIntrospection - Copyright (C) 2005 Marco Jez #ifndef OSGINTROSPECTION_METHODINFO_ #define OSGINTROSPECTION_METHODINFO_ #include #include #include #include #include #include #include #include namespace osgIntrospection { class Type; /// Class MethodInfo stores information about a class method. It is an /// abstract class, so it must be derived to provide the actual /// implementation of isConst() and invoke(). Instances of this class /// can't be modified after their creation. class OSGINTROSPECTION_EXPORT MethodInfo: public CustomAttributeProvider { public: /// Direct initialization constructor. inline MethodInfo(const std::string& qname, const Type& decltype, const Type& rtype, const ParameterInfoList& plist); /// Destructor inline ~MethodInfo(); /// Returns the Type object associated to the type that /// declares the reflected method. inline virtual const Type& getDeclaringType() const; /// Returns the name of the reflected method. inline virtual const std::string& getName() const; /// Returns the return type of the reflected method. inline const Type& getReturnType() const; /// Returns a list of objects that describe the reflected /// method's parameters. inline const ParameterInfoList& getParameters() const; /// Returns whether the reflected method is const or not. virtual bool isConst() const = 0; /// Returns whether the reflected method is static or not. virtual bool isStatic() const = 0; /// Returns whether this method would override the given /// method. bool overrides(const MethodInfo* other) const; /// Invokes the reflected method dynamically on the given const /// instance, passing it the arguments as a list of Value objects. inline virtual Value invoke(const Value& instance, ValueList& args) const; /// Invokes the reflected method dynamically on the given instance, /// passing it the arguments as a list of Value objects. inline virtual Value invoke(Value& instance, ValueList& args) const; /// Invokes the reflected static method dynamically passing it the /// arguments as a list of Value objects. inline virtual Value invoke(ValueList& args) const; /// Invokes the reflected method dynamically on the given const /// instance, without arguments. inline Value invoke(const Value& instance) const; /// Invokes the reflected method dynamically on the given /// instance, without arguments. inline Value invoke(Value& instance) const; /// Invokes the reflected static method without arguments. inline Value invoke() const; private: inline std::string strip_namespace(const std::string& s) const; virtual void getInheritedProviders(CustomAttributeProviderList& providers) const; std::string _name; const Type& _decltype; const Type& _rtype; ParameterInfoList _params; }; // INLINE METHODS inline MethodInfo::MethodInfo(const std::string& qname, const Type& decltype, const Type& rtype, const ParameterInfoList& plist) : CustomAttributeProvider(), _decltype(decltype), _rtype(rtype), _params(plist) { _name = strip_namespace(qname); } inline std::string MethodInfo::strip_namespace(const std::string& s) const { std::string::size_type p = s.rfind("::"); if (p != std::string::npos) return s.substr(p+2); return s; } inline const std::string& MethodInfo::getName() const { return _name; } inline const Type& MethodInfo::getDeclaringType() const { return _decltype; } inline const Type& MethodInfo::getReturnType() const { return _rtype; } inline const ParameterInfoList& MethodInfo::getParameters() const { return _params; } inline Value MethodInfo::invoke(const Value& , ValueList& ) const { throw InvokeNotImplementedException(); } inline Value MethodInfo::invoke(Value& , ValueList& ) const { throw InvokeNotImplementedException(); } inline Value MethodInfo::invoke(ValueList& ) const { throw InvokeNotImplementedException(); } inline Value MethodInfo::invoke(const Value& instance) const { ValueList args; return invoke(instance, args); } inline Value MethodInfo::invoke(Value& instance) const { ValueList args; return invoke(instance, args); } inline Value MethodInfo::invoke() const { ValueList args; return invoke(args); } inline MethodInfo::~MethodInfo() { for (ParameterInfoList::iterator i=_params.begin(); i!=_params.end(); ++i) delete *i; } } #endif