From: 191919 <191919@gmail.com> Date: Tue, 23 Jun 2015 16:59:11 +0000 (-0700) Subject: Fix for clang (llvm 3.7.0+) X-Git-Tag: v0.48.0~24 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=6a2eb674667ff14bee8e56a8613676b02cfb5740;p=folly.git Fix for clang (llvm 3.7.0+) Summary: Roughly described in https://github.com/facebook/hhvm/issues/5344. Closes #206 Reviewed By: @yfeldblum Differential Revision: D2170803 Pulled By: @sgolemon --- diff --git a/folly/DynamicConverter.h b/folly/DynamicConverter.h index 16c3a088..4c8b910c 100644 --- a/folly/DynamicConverter.h +++ b/folly/DynamicConverter.h @@ -54,13 +54,20 @@ BOOST_MPL_HAS_XXX_TRAIT_DEF(value_type); BOOST_MPL_HAS_XXX_TRAIT_DEF(iterator); BOOST_MPL_HAS_XXX_TRAIT_DEF(mapped_type); -template struct class_is_container { - typedef std::reverse_iterator some_iterator; +template struct iterator_class_is_container { + typedef std::reverse_iterator some_iterator; enum { value = has_value_type::value && - has_iterator::value && std::is_constructible::value }; }; +template +using class_is_container = typename + std::conditional< + has_iterator::value, + iterator_class_is_container, + std::false_type + >::type; + template struct class_is_range { enum { value = has_value_type::value && has_iterator::value }; diff --git a/folly/test/DynamicConverterTest.cpp b/folly/test/DynamicConverterTest.cpp index 63bfa022..2e5003de 100644 --- a/folly/test/DynamicConverterTest.cpp +++ b/folly/test/DynamicConverterTest.cpp @@ -35,17 +35,21 @@ TEST(DynamicConverter, template_metaprogramming) { bool c1f = is_container::value; bool c2f = is_container>::value; bool c3f = is_container::value; + bool c4f = class_is_container::value; bool c1t = is_container>::value; bool c2t = is_container>::value; bool c3t = is_container>::value; + bool c4t = class_is_container>::value; EXPECT_EQ(c1f, false); EXPECT_EQ(c2f, false); EXPECT_EQ(c3f, false); + EXPECT_EQ(c4f, false); EXPECT_EQ(c1t, true); EXPECT_EQ(c2t, true); EXPECT_EQ(c3t, true); + EXPECT_EQ(c4t, true); bool m1f = is_map::value;