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