2005-04-29 18:06:50 +08:00
/* -*-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
2004-12-09 13:28:20 +08:00
#ifndef OSGINTROSPECTION_EXCEPTIONS_
#define OSGINTROSPECTION_EXCEPTIONS_
#include <string>
#include <typeinfo>
namespace osgIntrospection
{
2005-03-14 17:28:31 +08:00
class Exception
{
public:
2005-04-29 19:19:58 +08:00
Exception(const std::string& msg): msg_(msg) {}
const std::string& what() const throw() { return msg_; }
2005-03-14 17:28:31 +08:00
private:
std::string msg_;
};
struct ReflectionException: public Exception
{
2005-04-29 19:19:58 +08:00
ReflectionException(const std::string& msg): Exception(msg) {}
2005-03-14 17:28:31 +08:00
};
struct TypeNotDefinedException: public ReflectionException
{
2005-04-29 19:19:58 +08:00
TypeNotDefinedException(const std::type_info& ti)
2005-03-14 17:28:31 +08:00
: ReflectionException("type `" + std::string(ti.name()) + "' is declared but not defined")
{
}
};
struct TypeIsAbstractException: public ReflectionException
{
2005-04-29 19:19:58 +08:00
TypeIsAbstractException(const std::type_info& ti)
2005-03-14 17:28:31 +08:00
: ReflectionException("cannot create instances of abstract type `" + std::string(ti.name()) + "'")
{
}
};
2005-04-04 21:50:07 +08:00
struct ConstructorNotFoundException: public ReflectionException
{
2005-04-29 19:19:58 +08:00
ConstructorNotFoundException(const std::type_info& ti)
: ReflectionException("could not find a suitable constructor in type `" + std::string(ti.name()) + "'")
{
}
2005-04-04 21:50:07 +08:00
};
struct InvokeNotImplementedException: public ReflectionException
{
2005-04-29 19:19:58 +08:00
InvokeNotImplementedException()
: ReflectionException("invoke() not implemented")
{
}
2005-04-04 21:50:07 +08:00
};
2005-03-14 17:28:31 +08:00
struct InvalidFunctionPointerException: public ReflectionException
{
InvalidFunctionPointerException()
: ReflectionException("invalid function pointer during invoke()")
{
}
};
struct ConstIsConstException: public ReflectionException
{
ConstIsConstException()
: ReflectionException("cannot modify a const value")
{
}
};
struct EmptyValueException: public ReflectionException
{
EmptyValueException()
: ReflectionException("cannot retrieve an empty value")
{
}
};
struct TypeNotFoundException: public ReflectionException
{
2005-04-29 19:19:58 +08:00
TypeNotFoundException(const std::string& qname)
2005-03-14 17:28:31 +08:00
: ReflectionException("type `" + qname + "' not found")
{
}
};
struct MethodNotFoundException: public ReflectionException
{
2005-04-29 19:19:58 +08:00
MethodNotFoundException(const std::string& name, const std::string& cname)
2005-03-14 17:28:31 +08:00
: ReflectionException("could not find a suitable method of name `" + name + "' in class `" + cname + "'")
{
}
};
struct StreamWriteErrorException: public ReflectionException
{
StreamWriteErrorException()
: ReflectionException("an error occured while trying to write to a stream")
{
}
};
struct StreamReadErrorException: public ReflectionException
{
StreamReadErrorException()
: ReflectionException("an error occured while trying to read from a stream")
{
}
};
class StreamingNotSupportedException: public ReflectionException
{
public:
enum OperationType
{
ANY,
TEXT_WRITE,
TEXT_READ,
BINARY_WRITE,
BINARY_READ
};
2005-04-29 19:19:58 +08:00
StreamingNotSupportedException(OperationType op, const std::type_info& type)
2005-03-14 17:28:31 +08:00
: ReflectionException(build_msg(op, type))
{
}
private:
2005-04-29 19:19:58 +08:00
std::string build_msg(OperationType op, const std::type_info& type)
2005-03-14 17:28:31 +08:00
{
std::string opstr;
switch (op)
{
case TEXT_WRITE: opstr = "writing to text stream"; break;
case TEXT_READ: opstr = "reading from text stream"; break;
case BINARY_WRITE: opstr = "writing to binary stream"; break;
case BINARY_READ: opstr = "reading from binary stream"; break;
case ANY:
default: opstr = "streaming";
}
return opstr + std::string(" is not supported on type `" + std::string(type.name()) + "'");
}
};
struct TypeConversionException: public ReflectionException
{
2005-04-29 19:19:58 +08:00
TypeConversionException(const std::type_info& type1, const std::type_info& type2)
2005-03-14 17:28:31 +08:00
: ReflectionException("cannot convert from type `" + std::string(type1.name()) + "' to type `" + std::string(type2.name()) + "'")
{
}
};
class PropertyAccessException: public ReflectionException
{
public:
enum AccessType
{
GET,
SET,
IGET,
ISET,
AGET,
ASET,
ADD,
2005-04-04 21:50:07 +08:00
REMOVE,
2005-03-14 17:28:31 +08:00
COUNT
};
2005-04-29 19:19:58 +08:00
PropertyAccessException(const std::string& pname, AccessType denied)
2005-03-14 17:28:31 +08:00
: ReflectionException(build_msg(pname, denied))
{
}
private:
2005-04-29 19:19:58 +08:00
std::string build_msg(const std::string& pname, AccessType denied) const
2005-03-14 17:28:31 +08:00
{
std::string msg;
switch (denied)
{
case GET: msg = "retrieved"; break;
case SET: msg = "set"; break;
case IGET: msg = "retrieved with indices"; break;
case ISET: msg = "set with indices"; break;
case AGET: msg = "retrieved with array index"; break;
case ASET: msg = "set with array index"; break;
case ADD: msg = "added"; break;
2005-04-04 21:50:07 +08:00
case REMOVE: msg = "removed"; break;
2005-03-14 17:28:31 +08:00
case COUNT: msg = "counted"; break;
default: msg = "?";
}
return std::string("value for property `" + pname + "' cannot be " + msg);
}
};
struct IndexValuesNotDefinedException: ReflectionException
{
2005-04-29 19:19:58 +08:00
IndexValuesNotDefinedException(const std::string& name, const std::string& iname)
2005-03-14 17:28:31 +08:00
: ReflectionException("couldn't determine a finite set of values for index `" + iname + "' of property `" + name + "'. Make sure that either: 1) the index is an enumeration, or 2) a valid custom indexing attribute was assigned to the property.")
{
}
};
2005-04-04 21:50:07 +08:00
struct ComparisonNotPermittedException: ReflectionException
{
2005-04-29 19:19:58 +08:00
ComparisonNotPermittedException(const std::type_info& ti)
: ReflectionException("comparison not permitted on type `" + std::string(ti.name()) + "'")
{
}
2005-04-04 21:50:07 +08:00
};
struct ComparisonOperatorNotSupportedException: ReflectionException
{
2005-04-29 19:19:58 +08:00
ComparisonOperatorNotSupportedException(const std::type_info& ti, const std::string& op)
: ReflectionException("comparison operator `" + op + "' is not supported on type `" + std::string(ti.name()) + "'")
{
}
2005-04-04 21:50:07 +08:00
};
2004-12-09 13:28:20 +08:00
}
#endif