Don't capture json input by value (fixed #1822).
This commit is contained in:
		
							parent
							
								
									fb9a2643c8
								
							
						
					
					
						commit
						ddda67a096
					
				
					 2 changed files with 48 additions and 48 deletions
				
			
		| 
						 | 
				
			
			@ -78,30 +78,30 @@
 | 
			
		|||
@def NLOHMANN_JSON_SERIALIZE_ENUM
 | 
			
		||||
@since version 3.4.0
 | 
			
		||||
*/
 | 
			
		||||
#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...)                                           \
 | 
			
		||||
    template<typename BasicJsonType>                                                           \
 | 
			
		||||
    inline void to_json(BasicJsonType& j, const ENUM_TYPE& e)                                  \
 | 
			
		||||
    {                                                                                          \
 | 
			
		||||
        static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!");         \
 | 
			
		||||
        static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;                    \
 | 
			
		||||
        auto it = std::find_if(std::begin(m), std::end(m),                                     \
 | 
			
		||||
                               [e](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \
 | 
			
		||||
        {                                                                                      \
 | 
			
		||||
            return ej_pair.first == e;                                                         \
 | 
			
		||||
        });                                                                                    \
 | 
			
		||||
        j = ((it != std::end(m)) ? it : std::begin(m))->second;                                \
 | 
			
		||||
    }                                                                                          \
 | 
			
		||||
    template<typename BasicJsonType>                                                           \
 | 
			
		||||
    inline void from_json(const BasicJsonType& j, ENUM_TYPE& e)                                \
 | 
			
		||||
    {                                                                                          \
 | 
			
		||||
        static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!");         \
 | 
			
		||||
        static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;                    \
 | 
			
		||||
        auto it = std::find_if(std::begin(m), std::end(m),                                     \
 | 
			
		||||
                               [j](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \
 | 
			
		||||
        {                                                                                      \
 | 
			
		||||
            return ej_pair.second == j;                                                        \
 | 
			
		||||
        });                                                                                    \
 | 
			
		||||
        e = ((it != std::end(m)) ? it : std::begin(m))->first;                                 \
 | 
			
		||||
#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...)                                            \
 | 
			
		||||
    template<typename BasicJsonType>                                                            \
 | 
			
		||||
    inline void to_json(BasicJsonType& j, const ENUM_TYPE& e)                                   \
 | 
			
		||||
    {                                                                                           \
 | 
			
		||||
        static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!");          \
 | 
			
		||||
        static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;                     \
 | 
			
		||||
        auto it = std::find_if(std::begin(m), std::end(m),                                      \
 | 
			
		||||
                               [e](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool  \
 | 
			
		||||
        {                                                                                       \
 | 
			
		||||
            return ej_pair.first == e;                                                          \
 | 
			
		||||
        });                                                                                     \
 | 
			
		||||
        j = ((it != std::end(m)) ? it : std::begin(m))->second;                                 \
 | 
			
		||||
    }                                                                                           \
 | 
			
		||||
    template<typename BasicJsonType>                                                            \
 | 
			
		||||
    inline void from_json(const BasicJsonType& j, ENUM_TYPE& e)                                 \
 | 
			
		||||
    {                                                                                           \
 | 
			
		||||
        static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!");          \
 | 
			
		||||
        static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;                     \
 | 
			
		||||
        auto it = std::find_if(std::begin(m), std::end(m),                                      \
 | 
			
		||||
                               [&j](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \
 | 
			
		||||
        {                                                                                       \
 | 
			
		||||
            return ej_pair.second == j;                                                         \
 | 
			
		||||
        });                                                                                     \
 | 
			
		||||
        e = ((it != std::end(m)) ? it : std::begin(m))->first;                                  \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
// Ugly macros to avoid uglier copy-paste when specializing basic_json. They
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1782,30 +1782,30 @@ JSON_HEDLEY_DIAGNOSTIC_POP
 | 
			
		|||
@def NLOHMANN_JSON_SERIALIZE_ENUM
 | 
			
		||||
@since version 3.4.0
 | 
			
		||||
*/
 | 
			
		||||
#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...)                                           \
 | 
			
		||||
    template<typename BasicJsonType>                                                           \
 | 
			
		||||
    inline void to_json(BasicJsonType& j, const ENUM_TYPE& e)                                  \
 | 
			
		||||
    {                                                                                          \
 | 
			
		||||
        static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!");         \
 | 
			
		||||
        static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;                    \
 | 
			
		||||
        auto it = std::find_if(std::begin(m), std::end(m),                                     \
 | 
			
		||||
                               [e](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \
 | 
			
		||||
        {                                                                                      \
 | 
			
		||||
            return ej_pair.first == e;                                                         \
 | 
			
		||||
        });                                                                                    \
 | 
			
		||||
        j = ((it != std::end(m)) ? it : std::begin(m))->second;                                \
 | 
			
		||||
    }                                                                                          \
 | 
			
		||||
    template<typename BasicJsonType>                                                           \
 | 
			
		||||
    inline void from_json(const BasicJsonType& j, ENUM_TYPE& e)                                \
 | 
			
		||||
    {                                                                                          \
 | 
			
		||||
        static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!");         \
 | 
			
		||||
        static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;                    \
 | 
			
		||||
        auto it = std::find_if(std::begin(m), std::end(m),                                     \
 | 
			
		||||
                               [j](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \
 | 
			
		||||
        {                                                                                      \
 | 
			
		||||
            return ej_pair.second == j;                                                        \
 | 
			
		||||
        });                                                                                    \
 | 
			
		||||
        e = ((it != std::end(m)) ? it : std::begin(m))->first;                                 \
 | 
			
		||||
#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...)                                            \
 | 
			
		||||
    template<typename BasicJsonType>                                                            \
 | 
			
		||||
    inline void to_json(BasicJsonType& j, const ENUM_TYPE& e)                                   \
 | 
			
		||||
    {                                                                                           \
 | 
			
		||||
        static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!");          \
 | 
			
		||||
        static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;                     \
 | 
			
		||||
        auto it = std::find_if(std::begin(m), std::end(m),                                      \
 | 
			
		||||
                               [e](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool  \
 | 
			
		||||
        {                                                                                       \
 | 
			
		||||
            return ej_pair.first == e;                                                          \
 | 
			
		||||
        });                                                                                     \
 | 
			
		||||
        j = ((it != std::end(m)) ? it : std::begin(m))->second;                                 \
 | 
			
		||||
    }                                                                                           \
 | 
			
		||||
    template<typename BasicJsonType>                                                            \
 | 
			
		||||
    inline void from_json(const BasicJsonType& j, ENUM_TYPE& e)                                 \
 | 
			
		||||
    {                                                                                           \
 | 
			
		||||
        static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!");          \
 | 
			
		||||
        static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;                     \
 | 
			
		||||
        auto it = std::find_if(std::begin(m), std::end(m),                                      \
 | 
			
		||||
                               [&j](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \
 | 
			
		||||
        {                                                                                       \
 | 
			
		||||
            return ej_pair.second == j;                                                         \
 | 
			
		||||
        });                                                                                     \
 | 
			
		||||
        e = ((it != std::end(m)) ? it : std::begin(m))->first;                                  \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
// Ugly macros to avoid uglier copy-paste when specializing basic_json. They
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue