Merge pull request #1028 from gracicot/develop
Added support for string_view in C++17
This commit is contained in:
		
						commit
						bf348ca8a4
					
				
					 6 changed files with 152 additions and 4 deletions
				
			
		|  | @ -72,6 +72,23 @@ void from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s) | |||
|     s = *j.template get_ptr<const typename BasicJsonType::string_t*>(); | ||||
| } | ||||
| 
 | ||||
| template < | ||||
|     typename BasicJsonType, typename CompatibleStringType, | ||||
|     enable_if_t < | ||||
|         is_compatible_string_type<BasicJsonType, CompatibleStringType>::value and | ||||
|         not std::is_same<typename BasicJsonType::string_t, | ||||
|                          CompatibleStringType>::value, | ||||
|         int > = 0 > | ||||
| void from_json(const BasicJsonType& j, CompatibleStringType& s) | ||||
| { | ||||
|     if (JSON_UNLIKELY(not j.is_string())) | ||||
|     { | ||||
|         JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name()))); | ||||
|     } | ||||
| 
 | ||||
|     s = *j.template get_ptr<const typename BasicJsonType::string_t*>(); | ||||
| } | ||||
| 
 | ||||
| template<typename BasicJsonType> | ||||
| void from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val) | ||||
| { | ||||
|  |  | |||
|  | @ -51,6 +51,16 @@ struct external_constructor<value_t::string> | |||
|         j.m_value = std::move(s); | ||||
|         j.assert_invariant(); | ||||
|     } | ||||
| 
 | ||||
| 	template<typename BasicJsonType, typename CompatibleStringType, | ||||
| 		 enable_if_t<not std::is_same<CompatibleStringType, typename BasicJsonType::string_t>::value, | ||||
| 		             int> = 0> | ||||
| 		static void construct(BasicJsonType& j, const CompatibleStringType& str) | ||||
| 	{ | ||||
| 		j.m_type = value_t::string; | ||||
| 		j.m_value.string = j.template create<typename BasicJsonType::string_t>(str); | ||||
| 		j.assert_invariant(); | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| template<> | ||||
|  |  | |||
|  | @ -120,6 +120,17 @@ struct is_compatible_object_type_impl<true, RealType, CompatibleObjectType> | |||
|         std::is_constructible<typename RealType::mapped_type, typename CompatibleObjectType::mapped_type>::value; | ||||
| }; | ||||
| 
 | ||||
| template<bool B, class RealType, class CompatibleStringType> | ||||
| struct is_compatible_string_type_impl : std::false_type {}; | ||||
| 
 | ||||
| template<class RealType, class CompatibleStringType> | ||||
| struct is_compatible_string_type_impl<true, RealType, CompatibleStringType> | ||||
| { | ||||
|     static constexpr auto value = | ||||
|         std::is_same<typename RealType::value_type, typename CompatibleStringType::value_type>::value and | ||||
|         std::is_constructible<RealType, CompatibleStringType>::value; | ||||
| }; | ||||
| 
 | ||||
| template<class BasicJsonType, class CompatibleObjectType> | ||||
| struct is_compatible_object_type | ||||
| { | ||||
|  | @ -130,6 +141,15 @@ struct is_compatible_object_type | |||
|                                   typename BasicJsonType::object_t, CompatibleObjectType >::value; | ||||
| }; | ||||
| 
 | ||||
| template<class BasicJsonType, class CompatibleStringType> | ||||
| struct is_compatible_string_type | ||||
| { | ||||
|     static auto constexpr value = is_compatible_string_type_impl < | ||||
|                                   conjunction<negation<std::is_same<void, CompatibleStringType>>, | ||||
|                                   has_value_type<CompatibleStringType>>::value, | ||||
|                                   typename BasicJsonType::string_t, CompatibleStringType >::value; | ||||
| }; | ||||
| 
 | ||||
| template<typename BasicJsonType, typename T> | ||||
| struct is_basic_json_nested_type | ||||
| { | ||||
|  |  | |||
|  | @ -2829,9 +2829,9 @@ class basic_json | |||
|                    not detail::is_basic_json<ValueType>::value | ||||
| #ifndef _MSC_VER  // fix for issue #167 operator<< ambiguity under VS2015
 | ||||
|                    and not std::is_same<ValueType, std::initializer_list<typename string_t::value_type>>::value | ||||
| #endif | ||||
| #if defined(JSON_HAS_CPP_17) | ||||
| #if defined(JSON_HAS_CPP_17) && _MSC_VER <= 1914 | ||||
|                    and not std::is_same<ValueType, typename std::string_view>::value | ||||
| #endif | ||||
| #endif | ||||
|                    , int >::type = 0 > | ||||
|     operator ValueType() const | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue