123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- // Copyright 2020 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #ifndef THIRD_PARTY_HARFBUZZ_NG_UTILS_HB_SCOPED_H_
- #define THIRD_PARTY_HARFBUZZ_NG_UTILS_HB_SCOPED_H_
- // clang-format off
- #include <hb.h>
- #include <hb-subset.h>
- // clang-format on
- #include <memory>
- #include <type_traits>
- template <typename T>
- struct always_false : std::false_type {};
- template <class T>
- struct HbSpecializedDeleter {
- inline void operator()(T* obj) {
- static_assert(always_false<T>::value,
- "HbScoped is only allowed for HarfBuzz types that have a "
- "deleter specialization.");
- }
- };
- // Defines a scoped pointer type HbScoped based on std::unique_ptr, using the
- // corresponsing HarfBuzz destructors to commonly used public HarfBuzz types.
- // The interface of HbScoped is the same as that of std::unique_ptr.
- //
- // void MyFunction() {
- // HbScoped<hb_blob_t> scoped_harfbuzz_blob(
- // hb_blob_create(mydata, mylength));
- //
- // DoSomethingWithBlob(scoped_harfbuzz_blob.get());
- // }
- //
- // When |scoped_harfbuzz_buffer| goes out of scope, hb_blob_destroy() is called
- // for the hb_blob_t* created from hb_blob_create().
- template <class T>
- using HbScoped = std::unique_ptr<T, HbSpecializedDeleter<T>>;
- #define SPECIALIZED_DELETER_FOR_HARFBUZZ_TYPE(TYPE, DESTRUCTOR) \
- template <> \
- struct HbSpecializedDeleter<TYPE> { \
- inline void operator()(TYPE* obj) { DESTRUCTOR(obj); } \
- };
- #define HB_TYPE_DESTRUCTOR_PAIRS_REPEAT(F) \
- F(hb_blob_t, hb_blob_destroy) \
- F(hb_buffer_t, hb_buffer_destroy) \
- F(hb_face_t, hb_face_destroy) \
- F(hb_font_t, hb_font_destroy) \
- F(hb_set_t, hb_set_destroy) \
- F(hb_subset_input_t, hb_subset_input_destroy)
- HB_TYPE_DESTRUCTOR_PAIRS_REPEAT(SPECIALIZED_DELETER_FOR_HARFBUZZ_TYPE)
- #endif // THIRD_PARTY_HARFBUZZ_NG_UTILS_HB_SCOPED_H_
|