1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef IPC_PARAM_TRAITS_MACROS_H_ 6*6777b538SAndroid Build Coastguard Worker #define IPC_PARAM_TRAITS_MACROS_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <string> 9*6777b538SAndroid Build Coastguard Worker #include <type_traits> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker // Traits generation for structs. 12*6777b538SAndroid Build Coastguard Worker #define IPC_STRUCT_TRAITS_BEGIN(struct_name) \ 13*6777b538SAndroid Build Coastguard Worker namespace IPC { \ 14*6777b538SAndroid Build Coastguard Worker template <> \ 15*6777b538SAndroid Build Coastguard Worker struct IPC_MESSAGE_EXPORT ParamTraits<struct_name> { \ 16*6777b538SAndroid Build Coastguard Worker typedef struct_name param_type; \ 17*6777b538SAndroid Build Coastguard Worker static void Write(base::Pickle* m, const param_type& p); \ 18*6777b538SAndroid Build Coastguard Worker static bool Read(const base::Pickle* m, \ 19*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter, \ 20*6777b538SAndroid Build Coastguard Worker param_type* p); \ 21*6777b538SAndroid Build Coastguard Worker static void Log(const param_type& p, std::string* l); \ 22*6777b538SAndroid Build Coastguard Worker }; \ 23*6777b538SAndroid Build Coastguard Worker } 24*6777b538SAndroid Build Coastguard Worker 25*6777b538SAndroid Build Coastguard Worker #define IPC_STRUCT_TRAITS_MEMBER(name) 26*6777b538SAndroid Build Coastguard Worker #define IPC_STRUCT_TRAITS_PARENT(type) 27*6777b538SAndroid Build Coastguard Worker #define IPC_STRUCT_TRAITS_END() 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker // Convenience macro for defining enumerated type traits for types which are 30*6777b538SAndroid Build Coastguard Worker // not range-checked by the IPC system. The author of the message handlers 31*6777b538SAndroid Build Coastguard Worker // is responsible for all validation. This macro should not need to be 32*6777b538SAndroid Build Coastguard Worker // subsequently redefined. 33*6777b538SAndroid Build Coastguard Worker #define IPC_ENUM_TRAITS(type) \ 34*6777b538SAndroid Build Coastguard Worker IPC_ENUM_TRAITS_VALIDATE(type, true) 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker // Convenience macro for defining enumerated type traits for types which are 37*6777b538SAndroid Build Coastguard Worker // range-checked by the IPC system to be in the range of 0..maxvalue inclusive. 38*6777b538SAndroid Build Coastguard Worker // This macro should not need to be subsequently redefined. 39*6777b538SAndroid Build Coastguard Worker #define IPC_ENUM_TRAITS_MAX_VALUE(type, maxvalue) \ 40*6777b538SAndroid Build Coastguard Worker IPC_ENUM_TRAITS_MIN_MAX_VALUE(type, 0, maxvalue) 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker // Convenience macro for defining enumerated type traits for types which are 43*6777b538SAndroid Build Coastguard Worker // range-checked by the IPC system to be in the range of minvalue..maxvalue 44*6777b538SAndroid Build Coastguard Worker // inclusive. This macro should not need to be subsequently redefined. 45*6777b538SAndroid Build Coastguard Worker #define IPC_ENUM_TRAITS_MIN_MAX_VALUE(typ, minvalue, maxvalue) \ 46*6777b538SAndroid Build Coastguard Worker IPC_ENUM_TRAITS_VALIDATE( \ 47*6777b538SAndroid Build Coastguard Worker typ, (static_cast<std::underlying_type<typ>::type>(value) >= \ 48*6777b538SAndroid Build Coastguard Worker static_cast<std::underlying_type<typ>::type>(minvalue) && \ 49*6777b538SAndroid Build Coastguard Worker static_cast<std::underlying_type<typ>::type>(value) <= \ 50*6777b538SAndroid Build Coastguard Worker static_cast<std::underlying_type<typ>::type>(maxvalue))) 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker // Traits generation for enums. This macro may be redefined later. 53*6777b538SAndroid Build Coastguard Worker #define IPC_ENUM_TRAITS_VALIDATE(enum_name, validation_expression) \ 54*6777b538SAndroid Build Coastguard Worker namespace IPC { \ 55*6777b538SAndroid Build Coastguard Worker template <> \ 56*6777b538SAndroid Build Coastguard Worker struct IPC_MESSAGE_EXPORT ParamTraits<enum_name> { \ 57*6777b538SAndroid Build Coastguard Worker typedef enum_name param_type; \ 58*6777b538SAndroid Build Coastguard Worker static void Write(base::Pickle* m, const param_type& p); \ 59*6777b538SAndroid Build Coastguard Worker static bool Read(const base::Pickle* m, \ 60*6777b538SAndroid Build Coastguard Worker base::PickleIterator* iter, \ 61*6777b538SAndroid Build Coastguard Worker param_type* p); \ 62*6777b538SAndroid Build Coastguard Worker static void Log(const param_type& p, std::string* l); \ 63*6777b538SAndroid Build Coastguard Worker }; \ 64*6777b538SAndroid Build Coastguard Worker } 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker #endif // IPC_PARAM_TRAITS_MACROS_H_ 67*6777b538SAndroid Build Coastguard Worker 68