add built-in array support in get_to
This commit is contained in:
		
							parent
							
								
									2806b201a8
								
							
						
					
					
						commit
						e6e6805c6c
					
				
					 4 changed files with 56 additions and 0 deletions
				
			
		|  | @ -157,6 +157,16 @@ void from_json(const BasicJsonType& j, std::valarray<T>& l) | |||
|     std::copy(j.m_value.array->begin(), j.m_value.array->end(), std::begin(l)); | ||||
| } | ||||
| 
 | ||||
| template <typename BasicJsonType, typename T, std::size_t N> | ||||
| auto from_json(const BasicJsonType& j, T (&arr)[N]) | ||||
| -> decltype(j.template get<T>(), void()) | ||||
| { | ||||
|     for (std::size_t i = 0; i < N; ++i) | ||||
|     { | ||||
|         arr[i] = j.at(i).template get<T>(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| template<typename BasicJsonType> | ||||
| void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/) | ||||
| { | ||||
|  |  | |||
|  | @ -2684,6 +2684,19 @@ class basic_json | |||
|         return v; | ||||
|     } | ||||
| 
 | ||||
|     template < | ||||
|         typename T, std::size_t N, | ||||
|         typename Array = T (&)[N], | ||||
|         detail::enable_if_t < | ||||
|             detail::has_from_json<basic_json_t, Array>::value, int > = 0 > | ||||
|     Array get_to(T (&v)[N]) const | ||||
|     noexcept(noexcept(JSONSerializer<Array>::from_json( | ||||
|                           std::declval<const basic_json_t&>(), v))) | ||||
|     { | ||||
|         JSONSerializer<Array>::from_json(*this, v); | ||||
|         return v; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /*!
 | ||||
|     @brief get a pointer value (implicit) | ||||
|  |  | |||
|  | @ -1445,6 +1445,16 @@ void from_json(const BasicJsonType& j, std::valarray<T>& l) | |||
|     std::copy(j.m_value.array->begin(), j.m_value.array->end(), std::begin(l)); | ||||
| } | ||||
| 
 | ||||
| template <typename BasicJsonType, typename T, std::size_t N> | ||||
| auto from_json(const BasicJsonType& j, T (&arr)[N]) | ||||
| -> decltype(j.template get<T>(), void()) | ||||
| { | ||||
|     for (std::size_t i = 0; i < N; ++i) | ||||
|     { | ||||
|         arr[i] = j.at(i).template get<T>(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| template<typename BasicJsonType> | ||||
| void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/) | ||||
| { | ||||
|  | @ -15475,6 +15485,19 @@ class basic_json | |||
|         return v; | ||||
|     } | ||||
| 
 | ||||
|     template < | ||||
|         typename T, std::size_t N, | ||||
|         typename Array = T (&)[N], | ||||
|         detail::enable_if_t < | ||||
|             detail::has_from_json<basic_json_t, Array>::value, int > = 0 > | ||||
|     Array get_to(T (&v)[N]) const | ||||
|     noexcept(noexcept(JSONSerializer<Array>::from_json( | ||||
|                           std::declval<const basic_json_t&>(), v))) | ||||
|     { | ||||
|         JSONSerializer<Array>::from_json(*this, v); | ||||
|         return v; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /*!
 | ||||
|     @brief get a pointer value (implicit) | ||||
|  |  | |||
|  | @ -386,6 +386,16 @@ TEST_CASE("value conversion") | |||
|             CHECK(json(a) == j); | ||||
|         } | ||||
| 
 | ||||
|         SECTION("built-in arrays") | ||||
|         { | ||||
|             const int nbs[] = {0, 1, 2}; | ||||
|             int nbs2[] = {0, 0, 0}; | ||||
| 
 | ||||
|             json j2 = nbs; | ||||
|             j2.get_to(nbs2); | ||||
|             CHECK(std::equal(std::begin(nbs), std::end(nbs), std::begin(nbs2))); | ||||
|         } | ||||
| 
 | ||||
|         SECTION("std::deque<json>") | ||||
|         { | ||||
|             std::deque<json> a{"previous", "value"}; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue