From Mike Wittman, support for reference parameters
This commit is contained in:
parent
3fbd958716
commit
264d69e0c9
123
include/osgIntrospection/ExtendedTypeInfo
Normal file
123
include/osgIntrospection/ExtendedTypeInfo
Normal file
@ -0,0 +1,123 @@
|
||||
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 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.
|
||||
*/
|
||||
|
||||
#ifndef OSGINTROSPECTION_EXTENDEDTYPEINFO_
|
||||
#define OSGINTROSPECTION_EXTENDEDTYPEINFO_
|
||||
|
||||
#include <typeinfo>
|
||||
#include <string>
|
||||
#include <osgIntrospection/type_traits>
|
||||
|
||||
namespace osgIntrospection
|
||||
{
|
||||
/// This class is a wrapper for std::type_info that also records whether
|
||||
/// a type is a reference or const reference. It permits osgIntrospection
|
||||
/// to make use of reference information that is ignored by typeid(), and
|
||||
/// to generate reference types based on it. The ExtendedTypeInfo for a
|
||||
/// class can be produced via the extended_typeid() functions, analogous
|
||||
/// to typeid().
|
||||
///
|
||||
class ExtendedTypeInfo
|
||||
{
|
||||
public:
|
||||
ExtendedTypeInfo(const std::type_info &ti, bool isReference, bool isConstReference) :
|
||||
_ti(&ti), _is_reference(isReference), _is_const_reference(isConstReference)
|
||||
{
|
||||
}
|
||||
|
||||
/// Orders ExtendedTypeInfo based first on std::type_info, then on
|
||||
/// reference, then on const reference. Note that we can't rely on
|
||||
/// default pointer comparison for std::type_info because it is not
|
||||
/// guaranteed that &typeid(T) always returns the same pointer for a
|
||||
/// given T (thanks Andrew Koenig).
|
||||
bool operator<(const ExtendedTypeInfo &other) const
|
||||
{
|
||||
if (_ti->before(*other._ti))
|
||||
return true;
|
||||
else if (other._ti->before(*_ti))
|
||||
return false;
|
||||
else if (_is_reference < other._is_reference)
|
||||
return true;
|
||||
else if (other._is_reference < _is_reference)
|
||||
return false;
|
||||
else
|
||||
return _is_const_reference < other._is_const_reference;
|
||||
}
|
||||
|
||||
/// Returns true if *this and other are the same type.
|
||||
bool operator==(const ExtendedTypeInfo &other) const
|
||||
{
|
||||
return (*_ti == *other._ti &&
|
||||
_is_reference == other._is_reference &&
|
||||
_is_const_reference == other._is_const_reference);
|
||||
}
|
||||
|
||||
/// Gets the std::type_info object for this type.
|
||||
const std::type_info &getStdTypeInfo() const
|
||||
{
|
||||
return *_ti;
|
||||
}
|
||||
|
||||
/// Returns true if this type is a reference or const reference.
|
||||
bool isReference() const
|
||||
{
|
||||
return _is_reference;
|
||||
}
|
||||
|
||||
/// Returns true if this type is a const reference.
|
||||
bool isConstReference() const
|
||||
{
|
||||
return _is_const_reference;
|
||||
}
|
||||
|
||||
/// Returns the name of this type, based on the std::type_info name.
|
||||
std::string name() const
|
||||
{
|
||||
if (_is_const_reference)
|
||||
return std::string("const ") + _ti->name() + " &";
|
||||
else if (_is_reference)
|
||||
return std::string(_ti->name()) + " &";
|
||||
else
|
||||
return _ti->name();
|
||||
}
|
||||
|
||||
private:
|
||||
const std::type_info *_ti;
|
||||
bool _is_reference;
|
||||
bool _is_const_reference;
|
||||
};
|
||||
}
|
||||
|
||||
/// extended_typeid works like typeid, but returns an ExtendedTypeInfo. This
|
||||
/// version operates on expressions.
|
||||
template <typename T>
|
||||
osgIntrospection::ExtendedTypeInfo
|
||||
extended_typeid(T)
|
||||
{
|
||||
return osgIntrospection::ExtendedTypeInfo(typeid(T),
|
||||
is_reference<T>::value,
|
||||
is_const_reference<T>::value);
|
||||
}
|
||||
|
||||
/// extended_typeid works like typeid, but returns an ExtendedTypeInfo. This
|
||||
/// version operates on types, which must be specified as a template parameter.
|
||||
template <typename T>
|
||||
osgIntrospection::ExtendedTypeInfo
|
||||
extended_typeid()
|
||||
{
|
||||
return osgIntrospection::ExtendedTypeInfo(typeid(T),
|
||||
is_reference<T>::value,
|
||||
is_const_reference<T>::value);
|
||||
}
|
||||
|
||||
#endif
|
63
include/osgIntrospection/type_traits
Normal file
63
include/osgIntrospection/type_traits
Normal file
@ -0,0 +1,63 @@
|
||||
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 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.
|
||||
*/
|
||||
|
||||
#ifndef OSGINTROSPECTION_TYPE_TRAITS_
|
||||
#define OSGINTROSPECTION_TYPE_TRAITS_
|
||||
|
||||
|
||||
/// is_reference is a compile-time template predicate to determine if a
|
||||
/// type is a reference type.
|
||||
template <typename T>
|
||||
struct is_reference
|
||||
{
|
||||
static const bool value = false;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct is_reference<T &>
|
||||
{
|
||||
static const bool value = true;
|
||||
};
|
||||
|
||||
|
||||
/// is_const_reference is a compile-time template predicate to determine
|
||||
/// if a type is a const reference type.
|
||||
template <typename T>
|
||||
struct is_const_reference
|
||||
{
|
||||
static const bool value = false;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct is_const_reference<const T &>
|
||||
{
|
||||
static const bool value = true;
|
||||
};
|
||||
|
||||
|
||||
/// remove_pointer is a compile-time template type mapper that produces
|
||||
/// the input type, but with any pointer modifier removed.
|
||||
template <typename T>
|
||||
struct remove_pointer
|
||||
{
|
||||
typedef T type;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct remove_pointer<T *>
|
||||
{
|
||||
typedef T type;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
11
src/osgIntrospection/Reflector.cpp
Normal file
11
src/osgIntrospection/Reflector.cpp
Normal file
@ -0,0 +1,11 @@
|
||||
#include <osgIntrospection/Reflector>
|
||||
|
||||
namespace osgIntrospection
|
||||
{
|
||||
template<>
|
||||
void Reflector<void>::init_reference_types()
|
||||
{
|
||||
// Avoid trying to register void & / const void &, which are
|
||||
// illegal types.
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user