00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 #ifndef COH_TYPED_CLASS_HPP
00017 #define COH_TYPED_CLASS_HPP
00018 
00019 #include "coherence/lang/compatibility.hpp"
00020 
00021 #include "coherence/lang/AbstractTypedClass.hpp"
00022 #include "coherence/lang/Class.hpp"
00023 #include "coherence/lang/IllegalArgumentException.hpp"
00024 #include "coherence/lang/Object.hpp"
00025 
00026 #include <ostream>
00027 #include <typeinfo>
00028 
00029 COH_OPEN_NAMESPACE2(coherence,lang)
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 template<class T> class TypedClass
00039     : public class_spec<TypedClass<T>,
00040         extends<AbstractTypedClass<T> > >
00041     {
00042     friend class factory<TypedClass<T> >;
00043 
00044     
00045 
00046     public:
00047 
00048 
00049 
00050         typedef T Type;
00051 
00052 
00053     
00054 
00055     protected:
00056 
00057 
00058 
00059         TypedClass<T>()
00060             {
00061             }
00062 
00063     private:
00064 
00065 
00066 
00067         TypedClass<T>(const TypedClass<T>&);
00068 
00069 
00070     
00071 
00072     public:
00073 
00074 
00075 
00076         virtual Object::Handle newInstance(ObjectArray::View vaParam) const
00077             {
00078             if (vaParam == NULL || vaParam->length == 0)
00079                 {
00080                 return T::create();
00081                 }
00082             return AbstractTypedClass<T>::newInstance(vaParam);
00083             }
00084 
00085 
00086     
00087 
00088     public:
00089 
00090 
00091 
00092         virtual void toStream(std::ostream& out) const
00093             {
00094             out << "TypedClass<" << Class::getName() << ">";
00095             }
00096     };
00097 
00098 COH_CLOSE_NAMESPACE2
00099 
00100 #endif // COH_TYPED_CLASS_HPP