BDE 4.39.x Production Release
Loading...
Searching...
No Matches
bdlar_fieldinfo.h
Go to the documentation of this file.
1/// @file bdlar_fieldinfo.h
2///
3/// The content of this file has been pre-processed for Doxygen.
4///
5
6
7// bdlar_fieldinfo.h -*-C++-*-
8#ifndef INCLUDED_BDLAR_FIELDINFO
9#define INCLUDED_BDLAR_FIELDINFO
10
11#include <bsls_ident.h>
12BSLS_IDENT("$Id: $")
13
14/// @defgroup bdlar_fieldinfo bdlar_fieldinfo
15/// @brief Provide ...
16/// @addtogroup bdl
17/// @{
18/// @addtogroup bdlar
19/// @{
20/// @addtogroup bdlar_fieldinfo
21/// @{
22///
23/// <h1> Outline </h1>
24/// * <a href="#bdlar_fieldinfo-purpose"> Purpose</a>
25/// * <a href="#bdlar_fieldinfo-classes"> Classes </a>
26/// * <a href="#bdlar_fieldinfo-description"> Description </a>
27///
28/// # Purpose {#bdlar_fieldinfo-purpose}
29/// Provide ...
30///
31/// # Classes {#bdlar_fieldinfo-classes}
32///
33/// - bdlar::FieldInfoRef: ...
34///
35/// # Description {#bdlar_fieldinfo-description}
36/// This component provides ...
37///
38/#include <bsls_compilerfeatures.h>
39/#include <bsls_keyword.h>
40/// @}
41/** @} */
42/** @} */
43
44/** @addtogroup bdl
45 * @{
46 */
47/** @addtogroup bdlar
48 * @{
49 */
50/** @addtogroup bdlar_fieldinfo
51 * @{
52 */
53
54#include <bslmf_movableref.h>
55
56#include <bsl_concepts.h>
57
58
59namespace bdlar {
60
61#ifdef BSLS_COMPILERFEATURES_SUPPORT_CONCEPTS
62
63 // =================
64 // concept FieldInfo
65 // =================
66
67template <class t_TYPE>
68concept FieldInfo = requires (t_TYPE object)
69{
70 { object.formattingMode() } -> bsl::convertible_to<int>;
71 { object.id() } -> bsl::convertible_to<int>;
72 { object.name() } -> bsl::convertible_to<const char *>;
73 { object.nameLength() } -> bsl::convertible_to<int>;
74};
75
76#endif
77
78 // ======================
79 // struct FieldInfoVtable
80 // ======================
81
83 // TYPES
84 typedef const char *Annotation(const void *self);
85 typedef int FormattingMode(const void *self);
86 typedef int Id(const void *self);
87 typedef const char *Name(const void *self);
88 typedef int NameLength(const void *self);
89
90 // PUBLIC DATA
96};
97
98 // ==================
99 // class FieldInfoRef
100 // ==================
101
103
104 // DATA
105 const void *d_target_p;
106 const FieldInfoVtable *d_vtable_p;
107
108 public:
109 // CREATORS
110
111#ifdef BSLS_COMPILERFEATURES_SUPPORT_CONCEPTS
112 template <FieldInfo t_FIELD_INFO>
113 FieldInfoRef(const t_FIELD_INFO& target) BSLS_KEYWORD_NOEXCEPT;
114#else
115 template <class t_FIELD_INFO>
116 explicit FieldInfoRef(const t_FIELD_INFO& target);
117#endif
118
119 FieldInfoRef(const void *target, const FieldInfoVtable *vtable);
120
121 // ACCESSORS
122 const char *annotation() const;
123
124 int formattingMode() const;
125
126 int id() const;
127
128 const char *name() const;
129
130 int nameLength() const;
131
132 const void *target() const;
133
134 const FieldInfoVtable *vtable() const;
135};
136
137 // ===========================
138 // struct FieldInfo_VtableUtil
139 // ===========================
140
142 private:
143 // PRIVATE CLASS METHODS
144
145 template <class t_FIELD_INFO>
146 static const char *annotation(const void *target);
147
148 template <class t_FIELD_INFO>
149 static int formattingMode(const void *target);
150
151 template <class t_FIELD_INFO>
152 static int id(const void *target);
153
154 template <class t_FIELD_INFO>
155 static const char *name(const void *target);
156
157 template <class t_FIELD_INFO>
158 static int nameLength(const void *target);
159
160 public:
161 // CLASS METHODS
162 template <class t_FIELD_INFO>
163 static const FieldInfoVtable *getVtable();
164};
165
166// ============================================================================
167// INLINE DEFINITIONS
168// ============================================================================
169
170 // ------------------
171 // class FieldInfoRef
172 // ------------------
173
174// CREATORS
175#ifdef BSLS_COMPILERFEATURES_SUPPORT_CONCEPTS
176template <FieldInfo t_FIELD_INFO>
177inline
178FieldInfoRef::FieldInfoRef(const t_FIELD_INFO& target) BSLS_KEYWORD_NOEXCEPT
179: d_target_p(&target)
180, d_vtable_p(FieldInfo_VtableUtil::getVtable<t_FIELD_INFO>())
181{
182}
183#else
184template <class t_FIELD_INFO>
185inline
186FieldInfoRef::FieldInfoRef(const t_FIELD_INFO& target)
187: d_target_p(&target)
188, d_vtable_p(FieldInfo_VtableUtil::getVtable<t_FIELD_INFO>())
189{
190}
191#endif
192
193inline
194FieldInfoRef::FieldInfoRef(const void *target, const FieldInfoVtable *vtable)
195: d_target_p(target)
196, d_vtable_p(vtable)
197{
198}
199
200// ACCESSORS
201inline
202const char *FieldInfoRef::annotation() const
203{
204 return (d_vtable_p->d_annotation_p)(d_target_p);
205}
206
207inline
209{
210 return (d_vtable_p->d_formattingMode_p)(d_target_p);
211}
212
213inline
215{
216 return (d_vtable_p->d_id_p)(d_target_p);
217}
218
219inline
220const char *FieldInfoRef::name() const
221{
222 return (d_vtable_p->d_name_p)(d_target_p);
223}
224
225inline
227{
228 return (d_vtable_p->d_nameLength_p)(d_target_p);
229}
230
231inline
232const void *FieldInfoRef::target() const
233{
234 return d_target_p;
235}
236
237inline
239{
240 return d_vtable_p;
241}
242
243// PRIVATE CLASS METHODS
244template <class t_FIELD_INFO>
245const char *FieldInfo_VtableUtil::annotation(const void *target)
246{
247 const t_FIELD_INFO& typedTarget =
248 *static_cast<const t_FIELD_INFO *>(target);
249
250 return typedTarget.annotation();
251}
252
253template <class t_FIELD_INFO>
254int FieldInfo_VtableUtil::formattingMode(const void *target)
255{
256 const t_FIELD_INFO& typedTarget =
257 *static_cast<const t_FIELD_INFO *>(target);
258
259 return typedTarget.formattingMode();
260}
261
262template <class t_FIELD_INFO>
263int FieldInfo_VtableUtil::id(const void *target)
264{
265 const t_FIELD_INFO& typedTarget =
266 *static_cast<const t_FIELD_INFO *>(target);
267
268 return typedTarget.id();
269}
270
271template <class t_FIELD_INFO>
272const char *FieldInfo_VtableUtil::name(const void *target)
273{
274 const t_FIELD_INFO& typedTarget =
275 *static_cast<const t_FIELD_INFO *>(target);
276
277 return typedTarget.name();
278}
279
280template <class t_FIELD_INFO>
281int FieldInfo_VtableUtil::nameLength(const void *target)
282{
283 const t_FIELD_INFO& typedTarget =
284 *static_cast<const t_FIELD_INFO *>(target);
285
286 return typedTarget.nameLength();
287}
288
289// CLASS METHODS
290template <class t_FIELD_INFO>
292{
293 static const FieldInfoVtable result = {
294 &annotation<t_FIELD_INFO>,
295 &formattingMode<t_FIELD_INFO>,
296 &id<t_FIELD_INFO>,
297 &name<t_FIELD_INFO>,
298 &nameLength<t_FIELD_INFO>
299 };
300
301 return &result;
302}
303
304} // close package namespace
305
306
307#endif // INCLUDED_BDLAR_FIELDINFO
308
309// ----------------------------------------------------------------------------
310// Copyright 2024 Bloomberg Finance L.P.
311//
312// Licensed under the Apache License, Version 2.0 (the "License");
313// you may not use this file except in compliance with the License.
314// You may obtain a copy of the License at
315//
316// http://www.apache.org/licenses/LICENSE-2.0
317//
318// Unless required by applicable law or agreed to in writing, software
319// distributed under the License is distributed on an "AS IS" BASIS,
320// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
321// See the License for the specific language governing permissions and
322// limitations under the License.
323// ----------------------------- END-OF-FILE ----------------------------------
324
325/** @} */
326/** @} */
327/** @} */
Definition bdlar_fieldinfo.h:102
const char * name() const
Definition bdlar_fieldinfo.h:220
const void * target() const
Definition bdlar_fieldinfo.h:232
const FieldInfoVtable * vtable() const
Definition bdlar_fieldinfo.h:238
const char * annotation() const
Definition bdlar_fieldinfo.h:202
int formattingMode() const
Definition bdlar_fieldinfo.h:208
FieldInfoRef(const t_FIELD_INFO &target)
Definition bdlar_fieldinfo.h:186
int id() const
Definition bdlar_fieldinfo.h:214
int nameLength() const
Definition bdlar_fieldinfo.h:226
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_KEYWORD_NOEXCEPT
Definition bsls_keyword.h:674
Definition bdlar_accessorref.h:59
Definition bdlar_fieldinfo.h:82
FormattingMode * d_formattingMode_p
Definition bdlar_fieldinfo.h:92
Id * d_id_p
Definition bdlar_fieldinfo.h:93
const char * Name(const void *self)
Definition bdlar_fieldinfo.h:87
int NameLength(const void *self)
Definition bdlar_fieldinfo.h:88
int FormattingMode(const void *self)
Definition bdlar_fieldinfo.h:85
const char * Annotation(const void *self)
Definition bdlar_fieldinfo.h:84
NameLength * d_nameLength_p
Definition bdlar_fieldinfo.h:95
Name * d_name_p
Definition bdlar_fieldinfo.h:94
int Id(const void *self)
Definition bdlar_fieldinfo.h:86
Annotation * d_annotation_p
Definition bdlar_fieldinfo.h:91
Definition bdlar_fieldinfo.h:141
static const FieldInfoVtable * getVtable()
Definition bdlar_fieldinfo.h:291