//////////////////////////////////////////////////////////////////////////////////////////////////// // NoesisGUI - http://www.noesisengine.com // Copyright (c) Noesis Technologies S.L. All Rights Reserved. //////////////////////////////////////////////////////////////////////////////////////////////////// #include #include #include #include #include namespace Noesis { //////////////////////////////////////////////////////////////////////////////////////////////////// template struct ValueStorageManagerHelper { static bool CheckType(const Type*, BaseComponent* value) { return Boxing::CanUnbox(value); } static Ptr Box(const void* value) { return Boxing::Box(*static_cast(value)); } static typename Boxing::Boxer::UnboxType Unbox(BaseComponent* value) { return Boxing::Unbox(value); } }; template struct ValueStorageManagerHelper> { static bool CheckType(const Type* type, BaseComponent* value) { return value != 0 ? type->IsAssignableFrom(value->GetClassType()) : true; } static Ptr Box(const void* value) { return *static_cast*>(value); } static Ptr Unbox(BaseComponent* value) { return Ptr(static_cast(value)); } }; //////////////////////////////////////////////////////////////////////////////////////////////////// template ValueStorageManager* ValueStorageManagerImpl::Clone() const { return new ValueStorageManagerImpl(); } //////////////////////////////////////////////////////////////////////////////////////////////////// template uint32_t ValueStorageManagerImpl::Size() const { return sizeof(T); } //////////////////////////////////////////////////////////////////////////////////////////////////// template bool ValueStorageManagerImpl::CheckType(const Type* type) const { return type->IsAssignableFrom(TypeOf>()); } //////////////////////////////////////////////////////////////////////////////////////////////////// template bool ValueStorageManagerImpl::CheckType(const Type* type, BaseComponent* value) const { return ValueStorageManagerHelper::CheckType(type, value); } //////////////////////////////////////////////////////////////////////////////////////////////////// template bool ValueStorageManagerImpl::Validate(ValidateValueCallback validate, BaseComponent* value) const { const T& value_ = ValueStorageManagerHelper::Unbox(value); return validate(&value_); } //////////////////////////////////////////////////////////////////////////////////////////////////// template void ValueStorageManagerImpl::Construct(ValueStorage* storage, const void* value) const { switch ((int)(sizeof(T) <= sizeof(ValueStorage))) { case true: { new(Placement(), storage) T(*static_cast(value)); break; } case false: { void* storage_ = Alloc(sizeof(T)); *storage = new(Placement(), storage_) T(*static_cast(value)); break; } default: NS_ASSERT_UNREACHABLE; } } //////////////////////////////////////////////////////////////////////////////////////////////////// template void ValueStorageManagerImpl::Destroy(ValueStorage* storage) const { switch ((int)(sizeof(T) <= sizeof(ValueStorage))) { case true: { static_cast(static_cast(storage))->~T(); break; } case false: { static_cast(static_cast(*storage))->~T(); Dealloc(*storage); break; } default: NS_ASSERT_UNREACHABLE; } } //////////////////////////////////////////////////////////////////////////////////////////////////// template void* ValueStorageManagerImpl::ToValue(const ValueStorage* storage) const { switch ((int)(sizeof(T) <= sizeof(ValueStorage))) { case true: { return const_cast(static_cast(storage)); } case false: { return const_cast(*static_cast(storage)); } default: NS_ASSERT_UNREACHABLE; } } //////////////////////////////////////////////////////////////////////////////////////////////////// template void ValueStorageManagerImpl::Copy(void* dst, const void* value) const { T& dst_ = *static_cast(dst); dst_ = *static_cast(value); } //////////////////////////////////////////////////////////////////////////////////////////////////// template void ValueStorageManagerImpl::Copy(void* dst, BaseComponent* value) const { const T& val = ValueStorageManagerHelper::Unbox(value); ValueStorageManagerImpl::Copy(dst, &val); } //////////////////////////////////////////////////////////////////////////////////////////////////// template Ptr ValueStorageManagerImpl::Box(const void* value) const { return ValueStorageManagerHelper::Box(value); } //////////////////////////////////////////////////////////////////////////////////////////////////// template const void* ValueStorageManagerImpl::GetValue(const DependencyObject* dob, const DependencyProperty* dp) const { return &dob->GetValue(dp); } //////////////////////////////////////////////////////////////////////////////////////////////////// template const void* ValueStorageManagerImpl::GetBaseValue(const DependencyObject* dob, const DependencyProperty* dp) const { return &dob->GetBaseValue(dp); } //////////////////////////////////////////////////////////////////////////////////////////////////// template bool IsSameValue(const T& l, const T& r) { return Noesis::Equals(l, r); } //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool IsSameValue(const Ptr& l, const Ptr& r) { return BaseObject::Equals(l, r); } //////////////////////////////////////////////////////////////////////////////////////////////////// template bool ValueStorageManagerImpl::IsSame(const void* left, const void* right) const { const T& l = *static_cast(left); const T& r = *static_cast(right); return IsSameValue(l, r); } //////////////////////////////////////////////////////////////////////////////////////////////////// template bool ValueStorageManagerImpl::IsSame(const void* left, BaseComponent* right) const { const T& l = *static_cast(left); const T& r = ValueStorageManagerHelper::Unbox(right); return IsSameValue(l, r); } //////////////////////////////////////////////////////////////////////////////////////////////////// template void ValueStorageManagerImpl::SetValue(DependencyObject* dob, const DependencyProperty* dp, const void* value, uint8_t priority, Expression* expression, const PropertyMetadata* metadata, Value::Destination destination) const { const T& value_ = *static_cast(value); T oldValue, coercedValue; dob->InternalSetValue(dp, sizeof(T), &oldValue, &value_, &coercedValue, priority, expression, metadata, destination, IsPtr::Result); } //////////////////////////////////////////////////////////////////////////////////////////////////// template void ValueStorageManagerImpl::SetValue(DependencyObject* dob, const DependencyProperty* dp, BaseComponent* value, uint8_t priority, Expression* expression, const PropertyMetadata* metadata, Value::Destination destination) const { const T& value_ = ValueStorageManagerHelper::Unbox(value); T oldValue, coercedValue; dob->InternalSetValue(dp, sizeof(T), &oldValue, &value_, &coercedValue, priority, expression, metadata, destination, IsPtr::Result); } //////////////////////////////////////////////////////////////////////////////////////////////////// template void ValueStorageManagerImpl::ClearAnimation(DependencyObject* dob, const DependencyProperty* dp) const { dob->ClearAnimation(dp); } //////////////////////////////////////////////////////////////////////////////////////////////////// template void ValueStorageManagerImpl::CoerceValue(DependencyObject* dob, const DependencyProperty* dp, StoredValue* storedValue, const void* defaultValue, const PropertyMetadata* metadata) const { T oldValue, coercedValue; dob->InternalCoerceValue(dp, sizeof(T), storedValue, defaultValue, &oldValue, &coercedValue, metadata, IsPtr::Result); } }