#ifndef HGL_PROPERTY_INCLUDE #define HGL_PROPERTY_INCLUDE #include namespace hgl { /** * 只读属性 */ template class PropertyRead { public: DefEvent(T,Get,() const); };//template class PropertyRead /** * 属性 */ template class Property { public: DefEvent(T,Get,() const); DefEvent(void,Set,(T)); public: Property() { Get=0; Set=0; } virtual ~Property() {} operator T() const{return Get();} void operator = (T v){Set(v);} void operator = (const Property &v){Set(v.operator T());} T operator !(){ return !(operator T());} T operator ~(){ return ~(operator T());} T operator ++ () { T v=operator T(); Set(++v); return v; } ///<前置++ T operator -- () { T v=operator T(); Set(--v); return v; } ///<前置-- T operator ++ (int) { T r,v; v=operator T(); r=v; Set(++v); return r; } ///<后置++ T operator -- (int) { T r,v; v=operator T(); r=v; Set(--v); return r; } ///<后置-- void operator += (T v) { if(v){Set(operator T() + v);} } void operator -= (T v) { if(v){Set(operator T() - v);} } void operator *= (T v) { Set(operator T() * v); } void operator /= (T v) { Set(operator T() / v); } void operator %= (T v) { Set(operator T() % v); } void operator &= (T v) { Set(operator T() & v); } void operator |= (T v) { Set(operator T() | v); } void operator >>= (int n) { Set((operator T())>>n);} void operator <<= (int n) { Set((operator T())<> (int n) { return (operator T())>>n;} T operator << (int n) { return (operator T())< class PropertyObject:public Property { public: T *operator ->()const{return Property::Get();} void operator =(void *pointer){Property::Set((T *)pointer);} };//class PropertyObject #ifdef __BORLANDC__ #define cmSetPropertyRead(name,tp,get) {name.Get=tp->get;} #define cmSetPropertyWrite(name,tp,set) {name.Set=tp->set;} #else #define cmSetPropertyRead(name,tp,get) { \ name.Get.vp_this=tp; \ name.Get.omf=ObjectMemberFunc(&get); \ } #define cmSetPropertyWrite(name,tp,set) { \ name.Set.vp_this=tp; \ name.Set.omf=ObjectMemberFunc(&set); \ } #endif// #define cmSetProperty(name,tp,get,set) { \ cmSetPropertyRead(name,tp,get); \ cmSetPropertyWrite(name,tp,set); \ } }//namespace hgl #endif//HGL_PROPERTY_INCLUDE