git.iko.soy/typeable/libphonenumber
on main help sign in
More standards-comforming passing of C++ class pointers

Expose pointers to the C++ class as reinterpret_cast pointers to a dummy C struct, instead of declaring functions with different types depending on __cplusplus.

commit5ea84414bd243063c1c1fe9094d3504aa4ab9ebf authormniip <mniip@mniip.com> dateFri 14 Apr 2023, 12:07 (4 years ago) parent06f0bc4
5 files changed+76−59
cxxbits/c_phonenumber.cpp+6−4 cxxbits/c_phonenumberutil.cpp+45−26 include/c_phonenumber.h+4−8 include/c_phonenumberutil.h+20−20 src/Data/PhoneNumber/Internal/Number.chs+1−1
cxxbits/c_phonenumber.cpp+6−4
@@ -55,7 +55,7 @@ static country_code_source unmarshal_country_code_source(PhoneNumber::CountryCod
5555 return static_cast<country_code_source>(value);
5656}
5757
58−extern "C" PhoneNumber *c_phone_number_marshal(phone_number const *c_number)
58+extern "C" CxxPhoneNumber *c_phone_number_marshal(phone_number const *c_number)
5959{
6060 PhoneNumber *number = new PhoneNumber();
6161 if (c_number->extension != nullptr)
@@ -72,11 +72,12 @@ extern "C" PhoneNumber *c_phone_number_marshal(phone_number const *c_number)
7272 number->set_country_code_source(marshal_country_code_source(c_number->country_code_source));
7373 if (c_number->has_number_of_leading_zeros)
7474 number->set_number_of_leading_zeros(c_number->number_of_leading_zeros);
75− return number;
75+ return reinterpret_cast<CxxPhoneNumber *>(number);
7676}
7777
78−extern "C" void c_phone_number_unmarshal(PhoneNumber const *number, phone_number *c_number)
78+extern "C" void c_phone_number_unmarshal(CxxPhoneNumber const *ptr, phone_number *c_number)
7979{
80+ auto number = reinterpret_cast<PhoneNumber const *>(ptr);
8081 if (number->has_extension())
8182 unmarshal_string_size(number->extension(), c_number->extension, c_number->extension_size);
8283 else
@@ -99,7 +100,8 @@ extern "C" void c_phone_number_unmarshal(PhoneNumber const *number, phone_number
99100 c_number->number_of_leading_zeros = number->number_of_leading_zeros();
100101}
101102
102−extern "C" void c_phone_number_free(PhoneNumber *number)
103+extern "C" void c_phone_number_free(CxxPhoneNumber *ptr)
103104{
105+ auto number = reinterpret_cast<PhoneNumber *>(ptr);
104106 delete number;
105107}
cxxbits/c_phonenumberutil.cpp+45−26
@@ -310,10 +310,11 @@ extern "C" void c_phone_number_util_normalize_dialable_chars_only(
310310}
311311
312312extern "C" void c_phone_number_util_get_national_significant_number(
313− PhoneNumber const *number,
313+ CxxPhoneNumber const *ptr,
314314 c_string *c_nsn
315315)
316316{
317+ auto number = reinterpret_cast<PhoneNumber const *>(ptr);
317318 std::string nsn;
318319 PhoneNumberUtil::GetInstance()->GetNationalSignificantNumber(*number, &nsn);
319320 unmarshal_c_string(nsn, *c_nsn);
@@ -330,23 +331,25 @@ extern "C" void c_phone_number_util_get_country_mobile_token(
330331}
331332
332333extern "C" void c_phone_number_util_format(
333− PhoneNumber const *number,
334+ CxxPhoneNumber const *ptr,
334335 phone_number_format format,
335336 c_string *c_string
336337)
337338{
339+ auto number = reinterpret_cast<PhoneNumber const *>(ptr);
338340 std::string string;
339341 PhoneNumberUtil::GetInstance()->Format(*number, marshal_phone_number_format(format), &string);
340342 unmarshal_c_string(string, *c_string);
341343}
342344
343345extern "C" void c_phone_number_util_format_national_number_with_carrier_code(
344− PhoneNumber const *number,
346+ CxxPhoneNumber const *ptr,
345347 char const *c_carrier_code,
346348 size_t c_carrier_code_size,
347349 c_string *c_string
348350)
349351{
352+ auto number = reinterpret_cast<PhoneNumber const *>(ptr);
350353 std::string const carrier_code(c_carrier_code, c_carrier_code_size);
351354 std::string string;
352355 PhoneNumberUtil::GetInstance()->FormatNationalNumberWithCarrierCode(*number, carrier_code, &string);
@@ -354,12 +357,13 @@ extern "C" void c_phone_number_util_format_national_number_with_carrier_code(
354357}
355358
356359extern "C" void c_phone_number_util_format_national_number_with_preferred_carrier_code(
357− PhoneNumber const *number,
360+ CxxPhoneNumber const *ptr,
358361 char const *c_carrier_code,
359362 size_t c_carrier_code_size,
360363 c_string *c_string
361364)
362365{
366+ auto number = reinterpret_cast<PhoneNumber const *>(ptr);
363367 std::string const carrier_code(c_carrier_code, c_carrier_code_size);
364368 std::string string;
365369 PhoneNumberUtil::GetInstance()->FormatNationalNumberWithPreferredCarrierCode(*number, carrier_code, &string);
@@ -367,13 +371,14 @@ extern "C" void c_phone_number_util_format_national_number_with_preferred_carrie
367371}
368372
369373extern "C" void c_phone_number_util_format_number_for_mobile_dialing(
370− PhoneNumber const *number,
374+ CxxPhoneNumber const *ptr,
371375 char const *c_region,
372376 size_t c_region_size,
373377 int with_formatting,
374378 c_string *c_string
375379)
376380{
381+ auto number = reinterpret_cast<PhoneNumber const *>(ptr);
377382 std::string const region(c_region, c_region_size);
378383 std::string string;
379384 PhoneNumberUtil::GetInstance()->FormatNumberForMobileDialing(*number, region, with_formatting, &string);
@@ -381,12 +386,13 @@ extern "C" void c_phone_number_util_format_number_for_mobile_dialing(
381386}
382387
383388extern "C" void c_phone_number_util_format_out_of_country_calling_number(
384− PhoneNumber const *number,
389+ CxxPhoneNumber const *ptr,
385390 char const *c_region,
386391 size_t c_region_size,
387392 c_string *c_string
388393)
389394{
395+ auto number = reinterpret_cast<PhoneNumber const *>(ptr);
390396 std::string const region(c_region, c_region_size);
391397 std::string string;
392398 PhoneNumberUtil::GetInstance()->FormatOutOfCountryCallingNumber(*number, region, &string);
@@ -394,12 +400,13 @@ extern "C" void c_phone_number_util_format_out_of_country_calling_number(
394400}
395401
396402extern "C" void c_phone_number_util_format_in_original_format(
397− PhoneNumber const *number,
403+ CxxPhoneNumber const *ptr,
398404 char const *c_region,
399405 size_t c_region_size,
400406 c_string *c_string
401407)
402408{
409+ auto number = reinterpret_cast<PhoneNumber const *>(ptr);
403410 std::string const region(c_region, c_region_size);
404411 std::string string;
405412 PhoneNumberUtil::GetInstance()->FormatInOriginalFormat(*number, region, &string);
@@ -407,24 +414,26 @@ extern "C" void c_phone_number_util_format_in_original_format(
407414}
408415
409416extern "C" void c_phone_number_util_format_out_of_country_keeping_alpha_chars(
410− PhoneNumber const *number,
417+ CxxPhoneNumber const *ptr,
411418 char const *c_region,
412419 size_t c_region_size,
413420 c_string *c_string
414421)
415422{
423+ auto number = reinterpret_cast<PhoneNumber const *>(ptr);
416424 std::string const region(c_region, c_region_size);
417425 std::string string;
418426 PhoneNumberUtil::GetInstance()->FormatOutOfCountryKeepingAlphaChars(*number, region, &string);
419427 unmarshal_c_string(string, *c_string);
420428}
421429
422−extern "C" PhoneNumber *c_phone_number_util_truncate_too_long_number(PhoneNumber const *input)
430+extern "C" CxxPhoneNumber *c_phone_number_util_truncate_too_long_number(CxxPhoneNumber const *ptr)
423431{
432+ auto input = reinterpret_cast<PhoneNumber const *>(ptr);
424433 auto *output = new PhoneNumber(*input);
425434 if (PhoneNumberUtil::GetInstance()->TruncateTooLongNumber(output))
426435 {
427− return output;
436+ return reinterpret_cast<CxxPhoneNumber *>(output);
428437 }
429438 else
430439 {
@@ -433,33 +442,37 @@ extern "C" PhoneNumber *c_phone_number_util_truncate_too_long_number(PhoneNumber
433442 }
434443}
435444
436−extern "C" phone_number_type c_phone_number_util_get_number_type(PhoneNumber const *number)
445+extern "C" phone_number_type c_phone_number_util_get_number_type(CxxPhoneNumber const *ptr)
437446{
447+ auto number = reinterpret_cast<PhoneNumber const *>(ptr);
438448 return unmarshal_phone_number_type(
439449 PhoneNumberUtil::GetInstance()->GetNumberType(*number)
440450 );
441451}
442452
443−extern "C" int c_phone_number_util_is_valid_number(PhoneNumber const *number)
453+extern "C" int c_phone_number_util_is_valid_number(CxxPhoneNumber const *ptr)
444454{
455+ auto number = reinterpret_cast<PhoneNumber const *>(ptr);
445456 return PhoneNumberUtil::GetInstance()->IsValidNumber(*number);
446457}
447458
448459extern "C" int c_phone_number_util_is_valid_number_for_region(
449− PhoneNumber const *number,
460+ CxxPhoneNumber const *ptr,
450461 char const *c_region,
451462 size_t c_region_size
452463)
453464{
465+ auto number = reinterpret_cast<PhoneNumber const *>(ptr);
454466 std::string const region(c_region, c_region_size);
455467 return PhoneNumberUtil::GetInstance()->IsValidNumberForRegion(*number, region);
456468}
457469
458470extern "C" void c_phone_number_util_get_region_code_for_number(
459− PhoneNumber const *number,
471+ CxxPhoneNumber const *ptr,
460472 c_string *c_region
461473)
462474{
475+ auto number = reinterpret_cast<PhoneNumber const *>(ptr);
463476 std::string region;
464477 PhoneNumberUtil::GetInstance()->GetRegionCodeForNumber(*number, &region);
465478 unmarshal_c_string(region, *c_region);
@@ -518,10 +531,11 @@ extern "C" void c_phone_number_util_get_ndd_prefix_for_region(
518531}
519532
520533extern "C" validation_result c_phone_number_util_is_possible_number_for_type_with_reason(
521− PhoneNumber const *number,
534+ CxxPhoneNumber const *ptr,
522535 phone_number_type ntype
523536)
524537{
538+ auto number = reinterpret_cast<PhoneNumber const *>(ptr);
525539 return unmarshal_validation_result(
526540 PhoneNumberUtil::GetInstance()->IsPossibleNumberForTypeWithReason(
527541 *number,
@@ -530,13 +544,15 @@ extern "C" validation_result c_phone_number_util_is_possible_number_for_type_wit
530544 );
531545}
532546
533−extern "C" int c_phone_number_util_can_be_internationally_dialed(PhoneNumber const *number)
547+extern "C" int c_phone_number_util_can_be_internationally_dialed(CxxPhoneNumber const *ptr)
534548{
549+ auto number = reinterpret_cast<PhoneNumber const *>(ptr);
535550 return PhoneNumberUtil::GetInstance()->CanBeInternationallyDialled(*number);
536551}
537552
538−extern "C" int c_phone_number_util_is_number_geographical_1(PhoneNumber const *number)
553+extern "C" int c_phone_number_util_is_number_geographical_1(CxxPhoneNumber const *ptr)
539554{
555+ auto number = reinterpret_cast<PhoneNumber const *>(ptr);
540556 return PhoneNumberUtil::GetInstance()->IsNumberGeographical(*number);
541557}
542558
@@ -556,14 +572,14 @@ extern "C" error_type c_phone_number_util_parse(
556572 size_t c_string_size,
557573 char const *c_region,
558574 size_t c_region_size,
559− PhoneNumber **number
575+ CxxPhoneNumber **number
560576)
561577{
562578 std::string const string(c_string, c_string_size);
563579 std::string const region(c_region, c_region_size);
564− *number = new PhoneNumber();
580+ *number = reinterpret_cast<CxxPhoneNumber *>(new PhoneNumber());
565581 return unmarshal_error_type(
566− PhoneNumberUtil::GetInstance()->Parse(string, region, *number)
582+ PhoneNumberUtil::GetInstance()->Parse(string, region, reinterpret_cast<PhoneNumber *>(*number))
567583 );
568584}
569585
@@ -572,22 +588,24 @@ extern "C" error_type c_phone_number_util_parse_and_keep_raw_input(
572588 size_t c_string_size,
573589 char const *c_region,
574590 size_t c_region_size,
575− PhoneNumber **number
591+ CxxPhoneNumber **number
576592)
577593{
578594 std::string const string(c_string, c_string_size);
579595 std::string const region(c_region, c_region_size);
580− *number = new PhoneNumber();
596+ *number = reinterpret_cast<CxxPhoneNumber *>(new PhoneNumber());
581597 return unmarshal_error_type(
582− PhoneNumberUtil::GetInstance()->ParseAndKeepRawInput(string, region, *number)
598+ PhoneNumberUtil::GetInstance()->ParseAndKeepRawInput(string, region, reinterpret_cast<PhoneNumber *>(*number))
583599 );
584600}
585601
586602extern "C" match_type c_phone_number_util_is_number_match(
587− PhoneNumber const *number1,
588− PhoneNumber const *number2
603+ CxxPhoneNumber const *ptr1,
604+ CxxPhoneNumber const *ptr2
589605)
590606{
607+ auto number1 = reinterpret_cast<PhoneNumber const *>(ptr1);
608+ auto number2 = reinterpret_cast<PhoneNumber const *>(ptr2);
591609 return unmarshal_match_type(
592610 PhoneNumberUtil::GetInstance()->IsNumberMatch(*number1, *number2)
593611 );
@@ -608,11 +626,12 @@ extern "C" match_type c_phone_number_util_is_number_match_with_two_strings(
608626}
609627
610628extern "C" match_type c_phone_number_util_is_number_match_with_one_string(
611− PhoneNumber const *number1,
629+ CxxPhoneNumber const *ptr1,
612630 char const *c_number2,
613631 size_t c_number2_size
614632)
615633{
634+ auto number1 = reinterpret_cast<PhoneNumber const *>(ptr1);
616635 std::string const number2(c_number2, c_number2_size);
617636 return unmarshal_match_type(
618637 PhoneNumberUtil::GetInstance()->IsNumberMatchWithOneString(*number1, number2)
include/c_phonenumber.h+4−8
@@ -43,20 +43,16 @@ typedef struct
4343 char has_number_of_leading_zeros;
4444} phone_number;
4545
46−#ifdef __cplusplus
47−typedef i18n::phonenumbers::PhoneNumber PhoneNumber;
48−#else
49−typedef struct PhoneNumber PhoneNumber;
50−#endif
46+struct CxxPhoneNumber;
5147
5248// The returned object is allocated by `new` and managed by C++ RAII, and it is
5349// haskell's responsibility to call its finalizer (c_phone_number_free).
54−PhoneNumber *c_phone_number_marshal(phone_number const *);
50+struct CxxPhoneNumber *c_phone_number_marshal(phone_number const *);
5551
5652// phone_number * points to an area which will be filled with the data of the
5753// given PhoneNumber.
58−void c_phone_number_unmarshal(PhoneNumber const *, phone_number *);
54+void c_phone_number_unmarshal(struct CxxPhoneNumber const *, phone_number *);
5955
60−void c_phone_number_free(PhoneNumber *);
56+void c_phone_number_free(struct CxxPhoneNumber *);
6157
6258#endif
include/c_phonenumberutil.h+20−20
@@ -97,34 +97,34 @@ int c_phone_number_util_is_alpha_number(char const *, size_t);
9797void c_phone_number_util_convert_alpha_characters_in_number(char const *, size_t, c_string *);
9898void c_phone_number_util_normalize_digits_only(char const *, size_t, c_string *);
9999void c_phone_number_util_normalize_dialable_chars_only(char const *, size_t, c_string *);
100−void c_phone_number_util_get_national_significant_number(PhoneNumber const *, c_string *);
100+void c_phone_number_util_get_national_significant_number(struct CxxPhoneNumber const *, c_string *);
101101void c_phone_number_util_get_country_mobile_token(int, c_string *);
102−void c_phone_number_util_format(PhoneNumber const *, enum phone_number_format, c_string *);
103−void c_phone_number_util_format_national_number_with_carrier_code(PhoneNumber const *, char const *, size_t, c_string *);
104−void c_phone_number_util_format_national_number_with_preferred_carrier_code(PhoneNumber const *, char const *, size_t, c_string *);
105−void c_phone_number_util_format_number_for_mobile_dialing(PhoneNumber const *, char const *, size_t, int, c_string *);
106−void c_phone_number_util_format_out_of_country_calling_number(PhoneNumber const *, char const *, size_t, c_string *);
107−void c_phone_number_util_format_in_original_format(PhoneNumber const *, char const *, size_t, c_string *);
108−void c_phone_number_util_format_out_of_country_keeping_alpha_chars(PhoneNumber const *, char const *, size_t, c_string *);
102+void c_phone_number_util_format(struct CxxPhoneNumber const *, enum phone_number_format, c_string *);
103+void c_phone_number_util_format_national_number_with_carrier_code(struct CxxPhoneNumber const *, char const *, size_t, c_string *);
104+void c_phone_number_util_format_national_number_with_preferred_carrier_code(struct CxxPhoneNumber const *, char const *, size_t, c_string *);
105+void c_phone_number_util_format_number_for_mobile_dialing(struct CxxPhoneNumber const *, char const *, size_t, int, c_string *);
106+void c_phone_number_util_format_out_of_country_calling_number(struct CxxPhoneNumber const *, char const *, size_t, c_string *);
107+void c_phone_number_util_format_in_original_format(struct CxxPhoneNumber const *, char const *, size_t, c_string *);
108+void c_phone_number_util_format_out_of_country_keeping_alpha_chars(struct CxxPhoneNumber const *, char const *, size_t, c_string *);
109109// /!\ May return NULL
110−PhoneNumber *c_phone_number_util_truncate_too_long_number(PhoneNumber const *);
111−enum phone_number_type c_phone_number_util_get_number_type(PhoneNumber const *);
112−int c_phone_number_util_is_valid_number(PhoneNumber const *);
113−int c_phone_number_util_is_valid_number_for_region(PhoneNumber const *, char const *, size_t);
114−void c_phone_number_util_get_region_code_for_number(PhoneNumber const *, c_string *);
110+struct CxxPhoneNumber *c_phone_number_util_truncate_too_long_number(struct CxxPhoneNumber const *);
111+enum phone_number_type c_phone_number_util_get_number_type(struct CxxPhoneNumber const *);
112+int c_phone_number_util_is_valid_number(struct CxxPhoneNumber const *);
113+int c_phone_number_util_is_valid_number_for_region(struct CxxPhoneNumber const *, char const *, size_t);
114+void c_phone_number_util_get_region_code_for_number(struct CxxPhoneNumber const *, c_string *);
115115int c_phone_number_util_get_country_code_for_region(char const *, size_t);
116116void c_phone_number_util_get_region_code_for_country_code(int, c_string *);
117117void c_phone_number_util_get_region_codes_for_country_calling_code(int, c_string **, size_t *);
118118int c_phone_number_util_is_nanpa_country(char const *, size_t);
119119void c_phone_number_util_get_ndd_prefix_for_region(char const *, size_t, int, c_string *);
120−enum validation_result c_phone_number_util_is_possible_number_for_type_with_reason(PhoneNumber const *, enum phone_number_type);
121−int c_phone_number_util_can_be_internationally_dialed(PhoneNumber const *);
122−int c_phone_number_util_is_number_geographical_1(PhoneNumber const *);
120+enum validation_result c_phone_number_util_is_possible_number_for_type_with_reason(struct CxxPhoneNumber const *, enum phone_number_type);
121+int c_phone_number_util_can_be_internationally_dialed(struct CxxPhoneNumber const *);
122+int c_phone_number_util_is_number_geographical_1(struct CxxPhoneNumber const *);
123123int c_phone_number_util_is_number_geographical_2(enum phone_number_type, int);
124−enum error_type c_phone_number_util_parse(char const *, size_t, char const *, size_t, PhoneNumber **);
125−enum error_type c_phone_number_util_parse_and_keep_raw_input(char const *, size_t, char const *, size_t, PhoneNumber **);
126−enum match_type c_phone_number_util_is_number_match(PhoneNumber const *, PhoneNumber const *);
124+enum error_type c_phone_number_util_parse(char const *, size_t, char const *, size_t, struct CxxPhoneNumber **);
125+enum error_type c_phone_number_util_parse_and_keep_raw_input(char const *, size_t, char const *, size_t, struct CxxPhoneNumber **);
126+enum match_type c_phone_number_util_is_number_match(struct CxxPhoneNumber const *, struct CxxPhoneNumber const *);
127127enum match_type c_phone_number_util_is_number_match_with_two_strings(char const *, size_t, char const *, size_t);
128−enum match_type c_phone_number_util_is_number_match_with_one_string(PhoneNumber const *, char const *, size_t);
128+enum match_type c_phone_number_util_is_number_match_with_one_string(struct CxxPhoneNumber const *, char const *, size_t);
129129
130130#endif
src/Data/PhoneNumber/Internal/Number.chs+1−1
@@ -126,7 +126,7 @@ acquireCPhoneNumber p = do
126126-- , 'Data.PhoneNumber.Number.numberOfLeadingZeros' :: !('Maybe' 'Int')
127127-- }
128128-- @
129−{#pointer *PhoneNumber foreign finalizer c_phone_number_free newtype#}
129+{#pointer *CxxPhoneNumber as PhoneNumber foreign finalizer c_phone_number_free newtype#}
130130
131131{#fun unsafe c_phone_number_marshal
132132 { withCPhoneNumber* `CPhoneNumber'