You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
graphengine/inc/graph/attr_value_serializable.h

192 lines
10 KiB

/**
* 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 <string>
#include <vector>
#include "graph/ge_attr_value.h"
namespace ge {
class GeAttrValue;
class _GeSerializable {
public:
template <typename T>
struct ge_serializable_int64_t_support_type {
using DT = typename std::remove_cv<T>::type;
static const bool value = std::is_same<DT, uint64_t>::value // by cast
|| std::is_same<DT, int32_t>::value || std::is_same<DT, uint32_t>::value ||
std::is_same<DT, int16_t>::value || std::is_same<DT, uint16_t>::value ||
std::is_same<DT, int8_t>::value || std::is_same<DT, uint8_t>::value;
};
template <typename T, typename T::__ge_serializable = 0>
static GeAttrValue SaveItemAsAttrValue(const T &t) {
return GeAttrValue::CreateFrom(t);
}
template <typename T, typename T::__ge_serializable = 0>
static GeAttrValue SaveItemAsAttrValue(const vector<T> &t) {
return GeAttrValue::CreateFrom(t);
}
template <typename T, GeAttrValue::enable_if_type_valid_t<T> = 0, typename DT = typename std::remove_cv<T>::type>
static GeAttrValue SaveItemAsAttrValue(const T &t) {
return GeAttrValue::CreateFrom<DT>(t);
}
// int64_t support type
template <typename T, typename std::enable_if<ge_serializable_int64_t_support_type<T>::value, int>::type = 0>
static GeAttrValue SaveItemAsAttrValue(const T &t) {
return GeAttrValue::CreateFrom<GeAttrValue::INT>(t);
}
// vector int64_t support type
template <typename T, typename std::enable_if<ge_serializable_int64_t_support_type<T>::value, int>::type = 0>
static GeAttrValue SaveItemAsAttrValue(const vector<T> &t) {
return GeAttrValue::CreateFrom<GeAttrValue::LIST_INT>(t);
}
template <typename T, typename T::__ge_serializable = 0>
static graphStatus LoadItemFromAttrValue(T &t, GeAttrValue &attrVal) {
return attrVal.GetValue(t);
}
template <typename T, typename T::__ge_serializable = 0>
static graphStatus LoadItemFromAttrValue(vector<T> &t, GeAttrValue &attrVal) {
return attrVal.GetValue(t);
}
template <typename T, GeAttrValue::enable_if_type_valid_t<T> = 0, typename DT = typename std::remove_cv<T>::type>
static graphStatus LoadItemFromAttrValue(T &t, GeAttrValue &attrVal) {
return attrVal.GetValue<DT>(t);
}
template <typename T, typename std::enable_if<ge_serializable_int64_t_support_type<T>::value, int>::type = 0>
static graphStatus LoadItemFromAttrValue(T &t, GeAttrValue &attrVal) {
return attrVal.GetValue<GeAttrValue::INT>(t);
}
template <typename T, typename std::enable_if<ge_serializable_int64_t_support_type<T>::value, int>::type = 0>
static graphStatus LoadItemFromAttrValue(vector<T> &t, GeAttrValue &attrVal) {
return attrVal.GetValue<GeAttrValue::LIST_INT>(t);
}
template <class T, class... Args>
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 <class T, class... Args>
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<GeAttrValue::NAMED_ATTRS>(named_attrs); \
} \
ge::graphStatus Load(const GeAttrValue &ar) { \
GeAttrValue::NAMED_ATTRS named_attrs; \
ge::graphStatus status = ar.GetValue<GeAttrValue::NAMED_ATTRS>(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_