1 /* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef META_API_NUMBER_H 17 #define META_API_NUMBER_H 18 19 #include <meta/base/interface_traits.h> 20 #include <meta/interface/detail/any.h> 21 #include <meta/interface/intf_object_registry.h> 22 23 META_BEGIN_NAMESPACE() 24 25 template<typename T> 26 using EnableIfBasicType = 27 BASE_NS::enable_if_t<!IsSharedOrWeakPtr_v<T> && !BASE_NS::is_convertible_v<BASE_NS::remove_const_t<T&>, IAny&>>; 28 29 REGISTER_CLASS(Number, "751c6067-4fb8-404b-a240-4fa6f32c725a", ObjectCategoryBits::NO_CATEGORY) 30 31 class Number { 32 public: Number()33 Number() : number_(META_NS::GetObjectRegistry().Create<IAny>(META_NS::ClassId::Number)) {} 34 35 template<typename T, typename = EnableIfBasicType<T>> Number(T t)36 Number(T t) : Number() 37 { 38 if constexpr (is_enum_v<T>) { 39 number_->SetValue(static_cast<BASE_NS::underlying_type_t<T>>(t)); 40 } else { 41 number_->SetValue(t); 42 } 43 } 44 Number(IAny::ConstPtr any)45 Number(IAny::ConstPtr any) : Number() 46 { 47 number_->CopyFrom(*any); 48 } 49 Number(const IAny & any)50 Number(const IAny& any) : Number() 51 { 52 number_->CopyFrom(any); 53 } 54 55 template<typename T, typename = EnableIfBasicType<T>> 56 Number& operator=(T t) 57 { 58 if constexpr (is_enum_v<T>) { 59 number_->SetValue(static_cast<BASE_NS::underlying_type_t<T>>(t)); 60 } else { 61 number_->SetValue(t); 62 } 63 return *this; 64 } 65 66 Number& operator=(IAny::ConstPtr any) 67 { 68 number_->CopyFrom(*any); 69 return *this; 70 } 71 72 Number& operator=(const IAny& any) 73 { 74 number_->CopyFrom(any); 75 return *this; 76 } 77 78 template<typename T> Get()79 T Get() const 80 { 81 T t; 82 if constexpr (is_enum_v<T>) { 83 BASE_NS::underlying_type_t<T> ut; 84 number_->GetValue(ut); 85 t = static_cast<T>(ut); 86 } else { 87 number_->GetValue(t); 88 } 89 return t; 90 } 91 92 private: 93 IAny::Ptr number_; 94 }; 95 96 META_END_NAMESPACE() 97 98 #endif 99