/** * Copyright 2019-2020 Huawei Technologies Co., Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef INC_GRAPH_ATTR_VALUE_SERIALIZABLE_H_ #define INC_GRAPH_ATTR_VALUE_SERIALIZABLE_H_ #include #include #include "graph/ge_attr_value.h" namespace ge { class GeAttrValue; class _GeSerializable { public: template struct ge_serializable_int64_t_support_type { using DT = typename std::remove_cv::type; static const bool value = std::is_same::value // by cast || std::is_same::value || std::is_same::value || std::is_same::value || std::is_same::value || std::is_same::value || std::is_same::value; }; template static GeAttrValue SaveItemAsAttrValue(const T &t) { return GeAttrValue::CreateFrom(t); } template static GeAttrValue SaveItemAsAttrValue(const vector &t) { return GeAttrValue::CreateFrom(t); } template = 0, typename DT = typename std::remove_cv::type> static GeAttrValue SaveItemAsAttrValue(const T &t) { return GeAttrValue::CreateFrom
(t); } // int64_t support type template ::value, int>::type = 0> static GeAttrValue SaveItemAsAttrValue(const T &t) { return GeAttrValue::CreateFrom(t); } // vector int64_t support type template ::value, int>::type = 0> static GeAttrValue SaveItemAsAttrValue(const vector &t) { return GeAttrValue::CreateFrom(t); } template static graphStatus LoadItemFromAttrValue(T &t, GeAttrValue &attrVal) { return attrVal.GetValue(t); } template static graphStatus LoadItemFromAttrValue(vector &t, GeAttrValue &attrVal) { return attrVal.GetValue(t); } template = 0, typename DT = typename std::remove_cv::type> static graphStatus LoadItemFromAttrValue(T &t, GeAttrValue &attrVal) { return attrVal.GetValue
(t); } template ::value, int>::type = 0> static graphStatus LoadItemFromAttrValue(T &t, GeAttrValue &attrVal) { return attrVal.GetValue(t); } template ::value, int>::type = 0> static graphStatus LoadItemFromAttrValue(vector &t, GeAttrValue &attrVal) { return attrVal.GetValue(t); } template static void SaveItem(GeAttrValue::NAMED_ATTRS &namedAttrs, string itemName, T &item, Args &... args) { GeAttrValue itemVal = SaveItemAsAttrValue(item); (void)namedAttrs.SetAttr(itemName, itemVal); SaveItem(namedAttrs, args...); } static void SaveItem(GeAttrValue::NAMED_ATTRS &namedAttrs __attribute__((__unused__))) {} template static graphStatus LoadItem(GeAttrValue::NAMED_ATTRS &namedAttrs, string itemName, T &item, Args &... args) { auto itemVal = namedAttrs.GetItem(itemName); auto status = LoadItemFromAttrValue(item, itemVal); if (status != GRAPH_SUCCESS) { return status; } return LoadItem(namedAttrs, args...); } static graphStatus LoadItem(GeAttrValue::NAMED_ATTRS &namedAttrs __attribute__((__unused__))) { return GRAPH_SUCCESS; } }; #define _GE_FI(a) #a, a #define _GE_MAP_FIELDS1(a1) _GE_FI(a1) #define _GE_MAP_FIELDS2(a1, a2) _GE_FI(a1), _GE_FI(a2) #define _GE_MAP_FIELDS3(a1, a2, a3) _GE_FI(a1), _GE_FI(a2), _GE_FI(a3) #define _GE_MAP_FIELDS4(a1, a2, a3, a4) _GE_FI(a1), _GE_FI(a2), _GE_FI(a3), _GE_FI(a4) #define _GE_MAP_FIELDS5(a1, a2, a3, a4, a5) _GE_FI(a1), _GE_FI(a2), _GE_FI(a3), _GE_FI(a4), _GE_FI(a5) #define _GE_MAP_FIELDS6(a1, a2, a3, a4, a5, a6) _GE_FI(a1), _GE_FI(a2), _GE_FI(a3), _GE_FI(a4), _GE_FI(a5), _GE_FI(a6) #define _GE_MAP_FIELDS7(a1, a2, a3, a4, a5, a6, a7) \ _GE_FI(a1) \ , _GE_FI(a2), _GE_FI(a3), _GE_FI(a4), _GE_FI(a5), _GE_FI(a6), _GE_FI(a7) #define _GE_MAP_FIELDS8(a1, a2, a3, a4, a5, a6, a7, a8) \ _GE_FI(a1) \ , _GE_FI(a2), _GE_FI(a3), _GE_FI(a4), _GE_FI(a5), _GE_FI(a6), _GE_FI(a7), _GE_FI(a8) #define _GE_MAP_FIELDS9(a1, a2, a3, a4, a5, a6, a7, a8, a9) \ _GE_FI(a1) \ , _GE_FI(a2), _GE_FI(a3), _GE_FI(a4), _GE_FI(a5), _GE_FI(a6), _GE_FI(a7), _GE_FI(a8), _GE_FI(a9) #define _GE_MAP_FIELDS10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \ _GE_FI(a1) \ , _GE_FI(a2), _GE_FI(a3), _GE_FI(a4), _GE_FI(a5), _GE_FI(a6), _GE_FI(a7), _GE_FI(a8), _GE_FI(a9), _GE_FI(a10) #define _GE_MAP_FIELDS11(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \ _GE_FI(a1) \ , _GE_FI(a2), _GE_FI(a3), _GE_FI(a4), _GE_FI(a5), _GE_FI(a6), _GE_FI(a7), _GE_FI(a8), _GE_FI(a9), _GE_FI(a10), \ _GE_FI(a11) #define _GE_MAP_FIELDS12(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) \ _GE_FI(a1) \ , _GE_FI(a2), _GE_FI(a3), _GE_FI(a4), _GE_FI(a5), _GE_FI(a6), _GE_FI(a7), _GE_FI(a8), _GE_FI(a9), _GE_FI(a10), \ _GE_FI(a11), _GE_FI(a12) #define _GE_MAP_FIELDS13(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) \ _GE_FI(a1) \ , _GE_FI(a2), _GE_FI(a3), _GE_FI(a4), _GE_FI(a5), _GE_FI(a6), _GE_FI(a7), _GE_FI(a8), _GE_FI(a9), _GE_FI(a10), \ _GE_FI(a11), _GE_FI(a12), _GE_FI(a13) #define _GE_MAP_FIELDS14(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) \ _GE_FI(a1) \ , _GE_FI(a2), _GE_FI(a3), _GE_FI(a4), _GE_FI(a5), _GE_FI(a6), _GE_FI(a7), _GE_FI(a8), _GE_FI(a9), _GE_FI(a10), \ _GE_FI(a11), _GE_FI(a12), _GE_FI(a13), _GE_FI(a14) #define _GE_MAP_FIELDS15(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) \ _GE_FI(a1) \ , _GE_FI(a2), _GE_FI(a3), _GE_FI(a4), _GE_FI(a5), _GE_FI(a6), _GE_FI(a7), _GE_FI(a8), _GE_FI(a9), _GE_FI(a10), \ _GE_FI(a11), _GE_FI(a12), _GE_FI(a13), _GE_FI(a14), _GE_FI(a15) #define _GE_PRIVATE_ARGS_GLUE(x, y) x y #define _GE_PRIVATE_MACRO_VAR_ARGS_IMPL_COUNT(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, N, \ ...) \ N #define _GE_PRIVATE_MACRO_VAR_ARGS_IMPL(args) _GE_PRIVATE_MACRO_VAR_ARGS_IMPL_COUNT args #define _GE_COUNT_MACRO_VAR_ARGS(...) \ _GE_PRIVATE_MACRO_VAR_ARGS_IMPL((__VA_ARGS__, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)) #define _GE_PRIVATE_MACRO_CHOOSE_HELPER2(M, count) M##count #define _GE_PRIVATE_MACRO_CHOOSE_HELPER1(M, count) _GE_PRIVATE_MACRO_CHOOSE_HELPER2(M, count) #define _GE_PRIVATE_MACRO_CHOOSE_HELPER(M, count) _GE_PRIVATE_MACRO_CHOOSE_HELPER1(M, count) #define _GE_INVOKE_VAR_MACRO(...) \ _GE_PRIVATE_ARGS_GLUE(_GE_PRIVATE_MACRO_CHOOSE_HELPER(_GE_MAP_FIELDS, _GE_COUNT_MACRO_VAR_ARGS(__VA_ARGS__)), \ (__VA_ARGS__)) #define GE_SERIALIZABLE(...) \ public: \ friend class ge::GeAttrValue; \ using __ge_serializable = int; \ \ private: \ ge::graphStatus Save(GeAttrValue &ar) const { \ GeAttrValue::NAMED_ATTRS named_attrs; \ _GeSerializable::SaveItem(named_attrs, _GE_INVOKE_VAR_MACRO(__VA_ARGS__)); \ return ar.SetValue(named_attrs); \ } \ ge::graphStatus Load(const GeAttrValue &ar) { \ GeAttrValue::NAMED_ATTRS named_attrs; \ ge::graphStatus status = ar.GetValue(named_attrs); \ if (status != GRAPH_SUCCESS) { \ return status; \ } \ return _GeSerializable::LoadItem(named_attrs, _GE_INVOKE_VAR_MACRO(__VA_ARGS__)); \ } // end NamedAttrs Helper: GE_SERIALIZABLE } // namespace ge #endif // INC_GRAPH_ATTR_VALUE_SERIALIZABLE_H_