1 /*
   2  * Copyright © 2009  Red Hat, Inc.
   3  * Copyright © 2018  Google, Inc.
   4  *
   5  *  This is part of HarfBuzz, a text shaping library.
   6  *
   7  * Permission is hereby granted, without written agreement and without
   8  * license or royalty fees, to use, copy, modify, and distribute this
   9  * software and its documentation for any purpose, provided that the
  10  * above copyright notice and the following two paragraphs appear in
  11  * all copies of this software.
  12  *
  13  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
  14  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
  15  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
  16  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
  17  * DAMAGE.
  18  *
  19  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
  20  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  21  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  22  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
  23  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  24  *
  25  * Red Hat Author(s): Behdad Esfahbod
  26  * Google Author(s): Behdad Esfahbod
  27  */
  28 
  29 #ifndef HB_BLOB_PRIVATE_HH
  30 #define HB_BLOB_PRIVATE_HH
  31 
  32 #include "hb-private.hh"
  33 
  34 #include "hb-object-private.hh"
  35 
  36 
  37 /*
  38  * hb_blob_t
  39  */
  40 
  41 struct hb_blob_t
  42 {
  43   inline void fini_shallow (void)
  44   {
  45     destroy_user_data ();
  46   }
  47 
  48   inline void destroy_user_data (void)
  49   {
  50     if (destroy)
  51     {
  52       destroy (user_data);
  53       user_data = nullptr;
  54       destroy = nullptr;
  55     }
  56   }
  57 
  58   HB_INTERNAL bool try_make_writable (void);
  59   HB_INTERNAL bool try_make_writable_inplace (void);
  60   HB_INTERNAL bool try_make_writable_inplace_unix (void);
  61 
  62   inline void lock (void)
  63   {
  64     hb_blob_make_immutable (this);
  65   }
  66 
  67   template <typename Type>
  68   inline const Type* as (void) const
  69   {
  70     return unlikely (!data) ? &Null(Type) : reinterpret_cast<const Type *> (data);
  71   }
  72 
  73   public:
  74   hb_object_header_t header;
  75   ASSERT_POD ();
  76 
  77   bool immutable;
  78 
  79   const char *data;
  80   unsigned int length;
  81   hb_memory_mode_t mode;
  82 
  83   void *user_data;
  84   hb_destroy_func_t destroy;
  85 };
  86 
  87 
  88 #endif /* HB_BLOB_PRIVATE_HH */