8#ifndef INCLUDED_BSLMF_ISCONVERTIBLE
9#define INCLUDED_BSLMF_ISCONVERTIBLE
206#include <bslscm_version.h>
226#ifdef BSLS_COMPILERFEATURES_SUPPORT_TRAITS_HEADER
227# include <type_traits>
230#ifndef BDE_DONT_ALLOW_TRANSITIVE_INCLUDES
234#if defined(BSLS_COMPILERFEATURES_SUPPORT_TRAITS_HEADER) && \
235 !(defined(BSLS_PLATFORM_CMP_MSVC) && BSLS_PLATFORM_CMP_VERSION <= 1900)
240# define BSLMF_ISCONVERTIBLE_USE_NATIVE_TRAITS
245template <
class t_FROM_TYPE,
class t_TO_TYPE>
246struct is_convertible;
248#ifdef BSLS_COMPILERFEATURES_SUPPORT_VARIABLE_TEMPLATES
251template <
class t_FROM_TYPE,
class t_TO_TYPE>
253 is_convertible<t_FROM_TYPE, t_TO_TYPE>::value;
265template <
class t_TYPE,
274template <
class t_TYPE>
280#if defined(BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES)
281template <
class t_TYPE>
284 typedef t_TYPE && type;
288template <
class t_TYPE>
293#if !defined(BSLS_PLATFORM_CMP_IBM)
294template <
class t_TYPE>
303#ifdef BSLMF_ISCONVERTIBLE_USE_NATIVE_TRAITS
307template <
class t_FROM_TYPE,
class t_TO_TYPE>
311 ::std::is_convertible<
312 typename BloombergLP::bslmf::IsConvertible_CheckComplete<
314 typename BloombergLP::bslmf::IsConvertible_CheckComplete<
315 t_TO_TYPE>::type>::value> {
341#if !defined(BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES)
344 template <
class t_TYPE>
349 template <
class t_TYPE>
354 template <
class t_TYPE>
359 template <
class t_TYPE>
380template <
class t_FROM_TYPE,
382#if defined(BSLS_PLATFORM_CMP_GNU) || defined(BSLS_PLATFORM_CMP_CLANG)
401#ifdef BSLS_PLATFORM_CMP_MSVC
402# pragma warning(push)
403# pragma warning(disable: 4244)
416#ifdef BSLS_PLATFORM_CMP_MSVC
434#define BSLMF_ISCONVERTIBLE_SAMETYPEVALUE(t_VALUE, \
439 template <class t_TYPE> \
440 struct IsConvertible_Imp<t_FROM, t_TO, t_FROM_FUND, t_TO_FUND> \
441 : bsl::integral_constant<bool, VALUE> { \
448#define BSLMF_ISCONVERTIBLE_VALUE(t_VALUE, \
453 template <class t_FROM_TYPE, class t_TO_TYPE> \
454 struct IsConvertible_Imp<t_FROM, t_TO, t_FROM_FUND, t_TO_FUND> \
455 : bsl::integral_constant<bool, t_VALUE> { \
463#define BSLMF_ISCONVERTIBLE_FORWARD(t_FROM, t_TO, t_FROM_FUND, t_TO_FUND) \
464 template <class t_FROM_TYPE, class t_TO_TYPE> \
465 struct IsConvertible_Imp<t_FROM, t_TO, t_FROM_FUND, t_TO_FUND> \
466 : IsConvertible_Imp<t_FROM, t_TO, 0, 0> { \
473BSLMF_ISCONVERTIBLE_SAMETYPEVALUE(0,
474 const volatile t_TYPE,
478BSLMF_ISCONVERTIBLE_SAMETYPEVALUE(0,
488BSLMF_ISCONVERTIBLE_VALUE(1,
489 const volatile t_FROM_TYPE,
493BSLMF_ISCONVERTIBLE_VALUE(1,
494 volatile t_FROM_TYPE,
504BSLMF_ISCONVERTIBLE_VALUE(1, const t_FROM_TYPE, const t_TO_TYPE&, 1, 1)
505BSLMF_ISCONVERTIBLE_VALUE(1, t_FROM_TYPE, const t_TO_TYPE&, 1, 1)
512BSLMF_ISCONVERTIBLE_FORWARD(const volatile t_FROM_TYPE,
513 const volatile t_TO_TYPE&, 1, 1)
514BSLMF_ISCONVERTIBLE_FORWARD( volatile t_FROM_TYPE,
515 const volatile t_TO_TYPE&, 1, 1)
516BSLMF_ISCONVERTIBLE_FORWARD(const t_FROM_TYPE,
517 const volatile t_TO_TYPE&, 1, 1)
518BSLMF_ISCONVERTIBLE_FORWARD( t_FROM_TYPE,
519 const volatile t_TO_TYPE&, 1, 1)
524BSLMF_ISCONVERTIBLE_FORWARD(const volatile t_FROM_TYPE,
525 volatile t_TO_TYPE&, 1, 1)
526BSLMF_ISCONVERTIBLE_FORWARD( volatile t_FROM_TYPE,
527 volatile t_TO_TYPE&, 1, 1)
528BSLMF_ISCONVERTIBLE_FORWARD(const t_FROM_TYPE,
529 volatile t_TO_TYPE&, 1, 1)
530BSLMF_ISCONVERTIBLE_FORWARD( t_FROM_TYPE,
531 volatile t_TO_TYPE&, 1, 1)
536BSLMF_ISCONVERTIBLE_FORWARD(const volatile t_FROM_TYPE, t_TO_TYPE&, 1, 1)
537BSLMF_ISCONVERTIBLE_FORWARD( volatile t_FROM_TYPE, t_TO_TYPE&, 1, 1)
538BSLMF_ISCONVERTIBLE_FORWARD(const t_FROM_TYPE, t_TO_TYPE&, 1, 1)
539BSLMF_ISCONVERTIBLE_FORWARD( t_FROM_TYPE, t_TO_TYPE&, 1, 1)
544template <class t_FROM_TYPE, class t_TO_TYPE>
556template <
class t_FROM_TYPE,
class t_TO_TYPE>
557struct IsConvertible_Imp<t_FROM_TYPE, t_TO_TYPE, 1, 1>
558 : IsConvertible_Imp<t_FROM_TYPE, double, 0, 0>::type {
568template <
class t_FROM_TYPE,
class t_TO_TYPE>
569struct IsConvertible_Imp<t_FROM_TYPE, t_TO_TYPE, 0, 1>
570 : IsConvertible_Imp<t_FROM_TYPE, double, 0, 0>::type {
580template <
class t_FROM_TYPE,
class t_TO_TYPE>
581struct IsConvertible_Imp<t_FROM_TYPE, t_TO_TYPE, 1, 0>
582 : IsConvertible_Imp<int, t_TO_TYPE, 0, 0>::type {
592#undef BSLMF_ISCONVERTIBLE_SAMETYPEVALUE
593#undef BSLMF_ISCONVERTIBLE_VALUE
594#undef BSLMF_ISCONVERTIBLE_FORWARD
598template <
class t_TO_TYPE>
601 typename bsl::remove_cv<t_TO_TYPE>::type>::type> {
604template <
class t_FROM_TYPE,
class t_TO_TYPE>
607 bsl::is_void<t_FROM_TYPE>::value ||
608 bsl::is_array<t_TO_TYPE>::value ||
609 bsl::is_function<t_TO_TYPE>::value> {
612template <
class t_FROM_TYPE,
class t_TO_TYPE>
615 IsConvertible_IsNeverConvertible<t_FROM_TYPE, t_TO_TYPE>::value,
617 IsConvertible_Imp<t_FROM_TYPE,
618 typename IsConvertible_LazyTrait<t_TO_TYPE>::type> >::
622template <
class t_FROM_TYPE,
class t_TO_TYPE>
625 bsl::is_void<t_TO_TYPE>::value,
626 typename bsl::is_void<t_FROM_TYPE>::type,
627 IsConvertible_FilterNeverConvertible<
628 typename IsConvertible_CheckComplete<t_FROM_TYPE>::type,
629 typename IsConvertible_CheckComplete<t_TO_TYPE>::type> >::type {
650template <
class t_FROM_TYPE,
class t_TO_TYPE>
652: BloombergLP::bslmf::IsConvertible_Conditional<t_FROM_TYPE, t_TO_TYPE>::type {
661template <
class t_TYPE>
673template <
class t_TYPE>
677template <
class t_TYPE>
681template <
class t_TYPE>
685template <
class t_TYPE>
689template <
class t_TYPE>
693template <
class t_TYPE>
697template <
class t_TYPE>
702template <
class t_TYPE>
706template <
class t_TYPE>
710template <
class t_TYPE>
715template <
class t_TYPE>
720template <
class t_TYPE>
724template <
class t_TYPE>
729template <
class t_TYPE>
734template <
class t_TYPE>
743template <
class t_TYPE>
747template <
class t_TYPE>
751template <
class t_TYPE>
755template <
class t_TYPE>
759template <
class t_TYPE>
763template <
class t_TYPE>
767template <
class t_TYPE>
771template <
class t_TYPE>
776template <
class t_TYPE>
780template <
class t_TYPE>
784template <
class t_TYPE>
789template <
class t_TYPE>
794template <
class t_TYPE>
798template <
class t_TYPE>
803template <
class t_TYPE>
808template <
class t_TYPE>
817template <
class t_TYPE>
819: BloombergLP::bslmf::IsConvertible_Conditional<t_TYPE, t_TYPE>::type {
822template <
class t_FROM_TYPE,
class t_TO_TYPE>
826template <
class t_FROM_TYPE,
class t_TO_TYPE>
831template <
class t_FROM_TYPE,
class t_TO_TYPE>
836template <
class t_FROM_TYPE,
class t_TO_TYPE>
838 const volatile t_TO_TYPE&>
846template <
class t_FROM_TYPE>
848 is_pointer<t_FROM_TYPE>::value,
849 typename remove_cv<t_FROM_TYPE>::type,
853template <
class t_FROM_TYPE,
class t_TO_TYPE>
858 typename BloombergLP::bslmf::IsConvertible_Conditional<
859 volatile t_FROM_TYPE,
860 t_TO_TYPE>::type>::type {
872template <
class t_FROM_TYPE,
class t_TO_TYPE>
896template <
class t_FROM_TYPE,
class t_TO_TYPE>
902#ifndef BDE_OPENSOURCE_PUBLICATION
907#ifdef bslmf_IsConvertible
908#undef bslmf_IsConvertible
911#define bslmf_IsConvertible bslmf::IsConvertible
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_KEYWORD_INLINE_VARIABLE
Definition bsls_keyword.h:665
Definition bdlat_valuetypefunctions.h:939
Definition bdlbb_blob.h:579
Definition bslmf_isconvertible.h:850
Definition bslmf_addlvaluereference.h:128
Definition bslmf_conditional.h:123
Definition bslmf_enableif.h:530
Definition bslmf_integralconstant.h:261
Definition bslmf_isconst.h:145
Definition bslmf_isconvertible.h:652
Definition bslmf_isconvertible.h:875
Definition bslmf_isfunction.h:232
Definition bslmf_isfundamental.h:330
Definition bslmf_isreference.h:137
Definition bslmf_isvoid.h:138
t_TYPE type
Definition bslmf_isconvertible.h:290
t_TYPE & type
Definition bslmf_isconvertible.h:277
Definition bslmf_isconvertible.h:268
@ k_CHECK_COMPLETE
Definition bslmf_isconvertible.h:271
t_TYPE type
Definition bslmf_isconvertible.h:269
Definition bslmf_isconvertible.h:629
Definition bslmf_isconvertible.h:619
Definition bslmf_isconvertible.h:388
@ value
Definition bslmf_isconvertible.h:407
bsl::integral_constant< bool, value > type
Definition bslmf_isconvertible.h:422
Definition bslmf_isconvertible.h:609
Definition bslmf_isconvertible.h:601
Definition bslmf_isconvertible.h:336
Definition bslmf_isconvertible.h:335
char a
Definition bslmf_isconvertible.h:335
Definition bslmf_isconvertible.h:333
static yes_type match(IsConvertible_Match &)
Return yes_type if called on IsConvertible_Match type.
static no_type match(const t_TYPE &)
static no_type match(const volatile t_TYPE &)
static bsl::enable_if< bsl::is_function< t_TYPE >::value, no_type >::type match(t_TYPE &)
Definition bslmf_isconvertible.h:897
Definition bslmf_matchanytype.h:195