| // Copyright 2012 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef IPC_PARAM_TRAITS_MACROS_H_ | 
 | #define IPC_PARAM_TRAITS_MACROS_H_ | 
 |  | 
 | #include <string> | 
 | #include <type_traits> | 
 |  | 
 | // Traits generation for structs. | 
 | #define IPC_STRUCT_TRAITS_BEGIN(struct_name)                 \ | 
 |   namespace IPC {                                            \ | 
 |   template <>                                                \ | 
 |   struct IPC_MESSAGE_EXPORT ParamTraits<struct_name> {       \ | 
 |     typedef struct_name param_type;                          \ | 
 |     static void Write(base::Pickle* m, const param_type& p); \ | 
 |     static bool Read(const base::Pickle* m,                  \ | 
 |                      base::PickleIterator* iter,             \ | 
 |                      param_type* p);                         \ | 
 |     static void Log(const param_type& p, std::string* l);    \ | 
 |   };                                                         \ | 
 |   } | 
 |  | 
 | #define IPC_STRUCT_TRAITS_MEMBER(name) | 
 | #define IPC_STRUCT_TRAITS_PARENT(type) | 
 | #define IPC_STRUCT_TRAITS_END() | 
 |  | 
 | // Convenience macro for defining enumerated type traits for types which are | 
 | // not range-checked by the IPC system. The author of the message handlers | 
 | // is responsible for all validation. This macro should not need to be | 
 | // subsequently redefined. | 
 | #define IPC_ENUM_TRAITS(type) \ | 
 |   IPC_ENUM_TRAITS_VALIDATE(type, true) | 
 |  | 
 | // Convenience macro for defining enumerated type traits for types which are | 
 | // range-checked by the IPC system to be in the range of 0..maxvalue inclusive. | 
 | // This macro should not need to be subsequently redefined. | 
 | #define IPC_ENUM_TRAITS_MAX_VALUE(type, maxvalue) \ | 
 |   IPC_ENUM_TRAITS_MIN_MAX_VALUE(type, 0, maxvalue) | 
 |  | 
 | // Convenience macro for defining enumerated type traits for types which are | 
 | // range-checked by the IPC system to be in the range of minvalue..maxvalue | 
 | // inclusive. This macro should not need to be subsequently redefined. | 
 | #define IPC_ENUM_TRAITS_MIN_MAX_VALUE(typ, minvalue, maxvalue)            \ | 
 |   IPC_ENUM_TRAITS_VALIDATE(                                               \ | 
 |       typ, (static_cast<std::underlying_type<typ>::type>(value) >=        \ | 
 |                 static_cast<std::underlying_type<typ>::type>(minvalue) && \ | 
 |             static_cast<std::underlying_type<typ>::type>(value) <=        \ | 
 |                 static_cast<std::underlying_type<typ>::type>(maxvalue))) | 
 |  | 
 | // Traits generation for enums. This macro may be redefined later. | 
 | #define IPC_ENUM_TRAITS_VALIDATE(enum_name, validation_expression) \ | 
 |   namespace IPC {                                                  \ | 
 |   template <>                                                      \ | 
 |   struct IPC_MESSAGE_EXPORT ParamTraits<enum_name> {               \ | 
 |     typedef enum_name param_type;                                  \ | 
 |     static void Write(base::Pickle* m, const param_type& p);       \ | 
 |     static bool Read(const base::Pickle* m,                        \ | 
 |                      base::PickleIterator* iter,                   \ | 
 |                      param_type* p);                               \ | 
 |     static void Log(const param_type& p, std::string* l);          \ | 
 |   };                                                               \ | 
 |   } | 
 |  | 
 | #endif  // IPC_PARAM_TRAITS_MACROS_H_ | 
 |  |