157template<
typename A,
typename LEN>
158struct Elem< Array<A, LEN> >
165 enum { Is_optional =
false };
158struct Elem< Array<A, LEN> > {
…};
169template<
typename A,
typename LEN>
178 enum { Is_optional =
false };
182template<
typename A,
typename LEN>
191 enum { Is_optional =
false };
194template<
typename A>
struct Class<
Array<A> > : Class<A>::type {};
195template<
typename A>
struct Class<Array_ref<A> > : Class<A>::type {};
199template<
typename A,
typename LEN,
typename ARRAY,
bool REF>
200struct Clnt_val_ops_d_in : Clnt_noops<ARRAY>
202 using Clnt_noops<ARRAY>::to_msg;
203 static int to_msg(
char *msg,
unsigned offset,
unsigned limit,
204 ARRAY a, Dir_in, Cls_data)
206 offset = align_to<LEN>(offset);
209 *
reinterpret_cast<LEN *
>(msg + offset) = a.length;
210 offset = align_to<A>(offset +
sizeof(LEN));
211 if (
L4_UNLIKELY(!check_size<A>(offset, limit, a.length)))
213 typedef typename L4::Types::Remove_const<A>::type elem_type;
214 elem_type *data =
reinterpret_cast<elem_type*
>(msg + offset);
217 if (!REF || data != a.data)
219 for (LEN i = 0; i < a.length; ++i)
223 return offset + a.length *
sizeof(A);
228template<
typename A,
typename LEN>
229struct Clnt_val_ops<Array<A, LEN>, Dir_in, Cls_data> :
230 Detail::Clnt_val_ops_d_in<A, LEN, Array<A, LEN>, false> {};
232template<
typename A,
typename LEN>
233struct Clnt_val_ops<Array_ref<A, LEN>, Dir_in, Cls_data> :
234 Detail::Clnt_val_ops_d_in<A, LEN, Array_ref<A, LEN>, true> {};
236template<
typename A,
typename LEN,
typename CLASS>
237struct Svr_val_ops< Array_ref<A, LEN>, Dir_in, CLASS >
238: Svr_noops< Array_ref<A, LEN> >
240 typedef Array_ref<A, LEN> svr_type;
242 using Svr_noops<svr_type>::to_svr;
243 static int to_svr(
char *msg,
unsigned offset,
unsigned limit,
244 svr_type &a, Dir_in, Cls_data)
246 offset = align_to<LEN>(offset);
249 a.length = *
reinterpret_cast<LEN *
>(msg + offset);
250 offset = align_to<A>(offset +
sizeof(LEN));
251 if (
L4_UNLIKELY(!check_size<A>(offset, limit, a.length)))
253 a.data =
reinterpret_cast<A*
>(msg + offset);
254 return offset + a.length *
sizeof(A);
258template<
typename A,
typename LEN>
259struct Svr_xmit< Array<A, LEN> > : Svr_xmit< Array_ref<A, LEN> > {};
261template<
typename A,
typename LEN>
262struct Clnt_val_ops<Array<A, LEN>, Dir_out, Cls_data> : Clnt_noops<Array<A, LEN> >
264 typedef Array<A, LEN> type;
266 using Clnt_noops<type>::from_msg;
267 static int from_msg(
char *msg,
unsigned offset,
unsigned limit,
long,
268 type &a, Dir_out, Cls_data)
270 offset = align_to<LEN>(offset);
274 LEN l = *
reinterpret_cast<LEN *
>(msg + offset);
276 offset = align_to<A>(offset +
sizeof(LEN));
280 A *data =
reinterpret_cast<A*
>(msg + offset);
287 for (
unsigned i = 0; i < l; ++i)
290 return offset + l *
sizeof(A);
294template<
typename A,
typename LEN>
295struct Clnt_val_ops<Array_ref<A, LEN>, Dir_out, Cls_data> :
296 Clnt_noops<Array_ref<A, LEN> >
298 typedef Array_ref<A, LEN> type;
300 using Clnt_noops<type>::from_msg;
301 static int from_msg(
char *msg,
unsigned offset,
unsigned limit,
long,
302 type &a, Dir_out, Cls_data)
304 offset = align_to<LEN>(offset);
308 LEN l = *
reinterpret_cast<LEN *
>(msg + offset);
310 offset = align_to<A>(offset +
sizeof(LEN));
314 a.data =
reinterpret_cast<A*
>(msg + offset);
316 return offset + l *
sizeof(A);
320template<
typename A,
typename LEN,
typename CLASS>
321struct Svr_val_ops<Array_ref<A, LEN>, Dir_out, CLASS> :
322 Svr_noops<Array_ref<typename L4::Types::Remove_const<A>::type, LEN> &>
324 typedef typename L4::Types::Remove_const<A>::type elem_type;
325 typedef Array_ref<elem_type, LEN> &svr_type;
327 using Svr_noops<svr_type>::to_svr;
328 static int to_svr(
char *msg,
unsigned offset,
unsigned limit,
329 svr_type a, Dir_out, Cls_data)
331 offset = align_to<LEN>(offset);
335 offset = align_to<A>(offset +
sizeof(LEN));
336 a.data =
reinterpret_cast<elem_type *
>(msg + offset);
337 a.length = (limit-offset) /
sizeof(A);
341 using Svr_noops<svr_type>::from_svr;
342 static int from_svr(
char *msg,
unsigned offset,
unsigned limit,
long,
343 svr_type a, Dir_out, Cls_data)
345 offset = align_to<LEN>(offset);
349 *
reinterpret_cast<LEN *
>(msg + offset) = a.length;
351 offset = align_to<A>(offset +
sizeof(LEN));
352 if (
L4_UNLIKELY(!check_size<A>(offset, limit, a.length)))
355 return offset + a.length *
sizeof(A);
359template<
typename A,
typename LEN>
360struct Svr_xmit<Array<A, LEN> &> : Svr_xmit<Array_ref<A, LEN> &> {};
363template<
typename A,
typename LEN>
367template<
typename A,
typename LEN>