[machinery] Allow using lazy-loader with void*

Fixes https://github.com/harfbuzz/harfbuzz/issues/3427
This commit is contained in:
Behdad Esfahbod 2022-02-11 13:16:25 -06:00
parent 3d22dae5f8
commit 6893723879
5 changed files with 69 additions and 16 deletions

View File

@ -345,7 +345,9 @@ test_gsub_would_substitute_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS)
COMPILED_TESTS = \ COMPILED_TESTS = \
test-algs \ test-algs \
test-array \ test-array \
test-bimap \
test-iter \ test-iter \
test-machinery \
test-map \ test-map \
test-number \ test-number \
test-ot-tag \ test-ot-tag \
@ -354,7 +356,6 @@ COMPILED_TESTS = \
test-serialize \ test-serialize \
test-unicode-ranges \ test-unicode-ranges \
test-vector \ test-vector \
test-bimap \
test-repacker \ test-repacker \
$(NULL) $(NULL)
COMPILED_TESTS_CPPFLAGS = $(HBCFLAGS) -DMAIN -UNDEBUG COMPILED_TESTS_CPPFLAGS = $(HBCFLAGS) -DMAIN -UNDEBUG
@ -370,18 +371,18 @@ test_array_SOURCES = test-array.cc
test_array_CPPFLAGS = $(HBCFLAGS) test_array_CPPFLAGS = $(HBCFLAGS)
test_array_LDADD = libharfbuzz.la $(HBLIBS) test_array_LDADD = libharfbuzz.la $(HBLIBS)
test_priority_queue_SOURCES = test-priority-queue.cc hb-static.cc test_bimap_SOURCES = test-bimap.cc hb-static.cc
test_priority_queue_CPPFLAGS = $(HBCFLAGS) test_bimap_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
test_priority_queue_LDADD = libharfbuzz.la $(HBLIBS) test_bimap_LDADD = $(COMPILED_TESTS_LDADD)
test_repacker_SOURCES = test-repacker.cc hb-static.cc
test_repacker_CPPFLAGS = $(HBCFLAGS)
test_repacker_LDADD = libharfbuzz.la libharfbuzz-subset.la $(HBLIBS)
test_iter_SOURCES = test-iter.cc hb-static.cc test_iter_SOURCES = test-iter.cc hb-static.cc
test_iter_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) test_iter_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
test_iter_LDADD = $(COMPILED_TESTS_LDADD) test_iter_LDADD = $(COMPILED_TESTS_LDADD)
test_machinery_SOURCES = test-machinery.cc hb-static.cc
test_machinery_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
test_machinery_LDADD = $(COMPILED_TESTS_LDADD)
test_map_SOURCES = test-map.cc hb-static.cc test_map_SOURCES = test-map.cc hb-static.cc
test_map_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) test_map_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
test_map_LDADD = $(COMPILED_TESTS_LDADD) test_map_LDADD = $(COMPILED_TESTS_LDADD)
@ -394,6 +395,14 @@ test_ot_tag_SOURCES = hb-ot-tag.cc
test_ot_tag_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) test_ot_tag_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
test_ot_tag_LDADD = $(COMPILED_TESTS_LDADD) test_ot_tag_LDADD = $(COMPILED_TESTS_LDADD)
test_priority_queue_SOURCES = test-priority-queue.cc hb-static.cc
test_priority_queue_CPPFLAGS = $(HBCFLAGS)
test_priority_queue_LDADD = libharfbuzz.la $(HBLIBS)
test_repacker_SOURCES = test-repacker.cc hb-static.cc
test_repacker_CPPFLAGS = $(HBCFLAGS)
test_repacker_LDADD = libharfbuzz.la libharfbuzz-subset.la $(HBLIBS)
test_set_SOURCES = test-set.cc hb-static.cc test_set_SOURCES = test-set.cc hb-static.cc
test_set_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) test_set_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
test_set_LDADD = $(COMPILED_TESTS_LDADD) test_set_LDADD = $(COMPILED_TESTS_LDADD)
@ -410,10 +419,6 @@ test_vector_SOURCES = test-vector.cc hb-static.cc
test_vector_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) test_vector_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
test_vector_LDADD = $(COMPILED_TESTS_LDADD) test_vector_LDADD = $(COMPILED_TESTS_LDADD)
test_bimap_SOURCES = test-bimap.cc hb-static.cc
test_bimap_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
test_bimap_LDADD = $(COMPILED_TESTS_LDADD)
dist_check_SCRIPTS = \ dist_check_SCRIPTS = \
check-c-linkage-decls.py \ check-c-linkage-decls.py \
check-externs.py \ check-externs.py \

View File

@ -1065,7 +1065,7 @@ hb_variation_from_string (const char *str, int len,
static inline void free_static_C_locale (); static inline void free_static_C_locale ();
static struct hb_C_locale_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer<hb_locale_t>, static struct hb_C_locale_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer<hb_locale_t>,
hb_C_locale_lazy_loader_t> hb_C_locale_lazy_loader_t>
{ {
static hb_locale_t create () static hb_locale_t create ()
{ {

View File

@ -194,7 +194,8 @@ struct hb_lazy_loader_t : hb_data_wrapper_t<Data, WheresData>
} }
const Returned * operator -> () const { return get (); } const Returned * operator -> () const { return get (); }
const Returned & operator * () const { return *get (); } template <typename U = Returned, hb_enable_if (!hb_is_same (U, void))>
const U & operator * () const { return *get (); }
explicit operator bool () const explicit operator bool () const
{ return get_stored () != Funcs::get_null (); } { return get_stored () != Funcs::get_null (); }
template <typename C> operator const C * () const { return get (); } template <typename C> operator const C * () const { return get (); }

View File

@ -485,12 +485,13 @@ if get_option('tests').enabled()
compiled_tests = { compiled_tests = {
'test-algs': ['test-algs.cc', 'hb-static.cc'], 'test-algs': ['test-algs.cc', 'hb-static.cc'],
'test-array': ['test-array.cc'], 'test-array': ['test-array.cc'],
'test-repacker': ['test-repacker.cc', 'hb-static.cc'],
'test-priority-queue': ['test-priority-queue.cc', 'hb-static.cc'],
'test-iter': ['test-iter.cc', 'hb-static.cc'], 'test-iter': ['test-iter.cc', 'hb-static.cc'],
'test-machinery': ['test-machinery.cc', 'hb-static.cc'],
'test-map': ['test-map.cc', 'hb-static.cc'], 'test-map': ['test-map.cc', 'hb-static.cc'],
'test-number': ['test-number.cc', 'hb-number.cc'], 'test-number': ['test-number.cc', 'hb-number.cc'],
'test-ot-tag': ['hb-ot-tag.cc'], 'test-ot-tag': ['hb-ot-tag.cc'],
'test-priority-queue': ['test-priority-queue.cc', 'hb-static.cc'],
'test-repacker': ['test-repacker.cc', 'hb-static.cc'],
'test-set': ['test-set.cc', 'hb-static.cc'], 'test-set': ['test-set.cc', 'hb-static.cc'],
'test-serialize': ['test-serialize.cc', 'hb-static.cc'], 'test-serialize': ['test-serialize.cc', 'hb-static.cc'],
'test-unicode-ranges': ['test-unicode-ranges.cc'], 'test-unicode-ranges': ['test-unicode-ranges.cc'],

46
src/test-machinery.cc Normal file
View File

@ -0,0 +1,46 @@
/*
* Copyright © 2022 Behdad Esfahbod
*
* This is part of HarfBuzz, a text shaping library.
*
* Permission is hereby granted, without written agreement and without
* license or royalty fees, to use, copy, modify, and distribute this
* software and its documentation for any purpose, provided that the
* above copyright notice and the following two paragraphs appear in
* all copies of this software.
*
* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*/
#include "hb.hh"
#include "hb-machinery.hh"
struct hb_intp_lazy_loader_t : hb_lazy_loader_t<int, hb_intp_lazy_loader_t>
{
static int* create () { return nullptr; }
static void destroy (int* l) {}
static int* get_null () { return nullptr; }
};
struct hb_void_lazy_loader_t : hb_lazy_loader_t<void, hb_void_lazy_loader_t>
{
static void* create () { return nullptr; }
static void destroy (void* l) {}
static void* get_null () { return nullptr; }
};
int
main (int argc, char **argv)
{
return 0;
}