Home | History | Annotate | Download | only in lib
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_
      6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_
      7 
      8 #include "mojo/public/cpp/bindings/lib/template_util.h"
      9 #include "mojo/public/cpp/system/core.h"
     10 
     11 namespace mojo {
     12 class String;
     13 
     14 namespace internal {
     15 template <typename T> class Array_Data;
     16 
     17 #pragma pack(push, 1)
     18 
     19 struct StructHeader {
     20   uint32_t num_bytes;
     21   uint32_t num_fields;
     22 };
     23 MOJO_COMPILE_ASSERT(sizeof(StructHeader) == 8, bad_sizeof_StructHeader);
     24 
     25 struct ArrayHeader {
     26   uint32_t num_bytes;
     27   uint32_t num_elements;
     28 };
     29 MOJO_COMPILE_ASSERT(sizeof(ArrayHeader) == 8, bad_sizeof_ArrayHeader);
     30 
     31 template <typename T>
     32 union StructPointer {
     33   uint64_t offset;
     34   T* ptr;
     35 };
     36 MOJO_COMPILE_ASSERT(sizeof(StructPointer<char>) == 8, bad_sizeof_StructPointer);
     37 
     38 template <typename T>
     39 union ArrayPointer {
     40   uint64_t offset;
     41   Array_Data<T>* ptr;
     42 };
     43 MOJO_COMPILE_ASSERT(sizeof(ArrayPointer<char>) == 8, bad_sizeof_ArrayPointer);
     44 
     45 union StringPointer {
     46   uint64_t offset;
     47   Array_Data<char>* ptr;
     48 };
     49 MOJO_COMPILE_ASSERT(sizeof(StringPointer) == 8, bad_sizeof_StringPointer);
     50 
     51 #pragma pack(pop)
     52 
     53 template <typename T>
     54 void ResetIfNonNull(T* ptr) {
     55   if (ptr)
     56     *ptr = T();
     57 }
     58 
     59 template <typename T>
     60 T FetchAndReset(T* ptr) {
     61   T temp = *ptr;
     62   *ptr = T();
     63   return temp;
     64 }
     65 
     66 template <typename H> struct IsHandle {
     67   enum { value = IsBaseOf<Handle, H>::value };
     68 };
     69 
     70 template <typename T, bool move_only = IsMoveOnlyType<T>::value>
     71 struct WrapperTraits;
     72 
     73 template <typename T> struct WrapperTraits<T, false> {
     74   typedef T DataType;
     75 };
     76 template <typename H> struct WrapperTraits<ScopedHandleBase<H>, true> {
     77   typedef H DataType;
     78 };
     79 template <typename S> struct WrapperTraits<S, true> {
     80   typedef typename S::Data_* DataType;
     81 };
     82 
     83 }  // namespace internal
     84 }  // namespace mojo
     85 
     86 #endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_
     87