♻️ refined SFINAE to fix some warnings
This commit is contained in:
		
							parent
							
								
									476b2e09be
								
							
						
					
					
						commit
						d2d65bb25b
					
				
					 2 changed files with 194 additions and 174 deletions
				
			
		| 
						 | 
				
			
			@ -704,116 +704,126 @@ class binary_writer
 | 
			
		|||
        oa->write_characters(vec.data(), sizeof(NumberType));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<typename NumberType>
 | 
			
		||||
    // UBJSON: write number (floating point)
 | 
			
		||||
    template<typename NumberType, typename std::enable_if<
 | 
			
		||||
                 std::is_floating_point<NumberType>::value, int>::type = 0>
 | 
			
		||||
    void write_number_with_ubjson_prefix(const NumberType n,
 | 
			
		||||
                                         const bool add_prefix)
 | 
			
		||||
    {
 | 
			
		||||
        if (std::is_floating_point<NumberType>::value)
 | 
			
		||||
        if (add_prefix)
 | 
			
		||||
        {
 | 
			
		||||
            oa->write_character(static_cast<CharType>('D'));  // float64
 | 
			
		||||
        }
 | 
			
		||||
        write_number(n);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // UBJSON: write number (unsigned integer)
 | 
			
		||||
    template<typename NumberType, typename std::enable_if<
 | 
			
		||||
                 std::is_unsigned<NumberType>::value, int>::type = 0>
 | 
			
		||||
    void write_number_with_ubjson_prefix(const NumberType n,
 | 
			
		||||
                                         const bool add_prefix)
 | 
			
		||||
    {
 | 
			
		||||
        if (n <= static_cast<uint64_t>((std::numeric_limits<int8_t>::max)()))
 | 
			
		||||
        {
 | 
			
		||||
            if (add_prefix)
 | 
			
		||||
            {
 | 
			
		||||
                oa->write_character(static_cast<CharType>('D'));  // float64
 | 
			
		||||
                oa->write_character(static_cast<CharType>('i'));  // int8
 | 
			
		||||
            }
 | 
			
		||||
            write_number(n);
 | 
			
		||||
            write_number(static_cast<uint8_t>(n));
 | 
			
		||||
        }
 | 
			
		||||
        else if (std::is_unsigned<NumberType>::value)
 | 
			
		||||
        else if (n <= (std::numeric_limits<uint8_t>::max)())
 | 
			
		||||
        {
 | 
			
		||||
            if (n <= (std::numeric_limits<int8_t>::max)())
 | 
			
		||||
            if (add_prefix)
 | 
			
		||||
            {
 | 
			
		||||
                if (add_prefix)
 | 
			
		||||
                {
 | 
			
		||||
                    oa->write_character(static_cast<CharType>('i'));  // int8
 | 
			
		||||
                }
 | 
			
		||||
                write_number(static_cast<uint8_t>(n));
 | 
			
		||||
                oa->write_character(static_cast<CharType>('U'));  // uint8
 | 
			
		||||
            }
 | 
			
		||||
            else if (n <= (std::numeric_limits<uint8_t>::max)())
 | 
			
		||||
            write_number(static_cast<uint8_t>(n));
 | 
			
		||||
        }
 | 
			
		||||
        else if (n <= static_cast<uint64_t>((std::numeric_limits<int16_t>::max)()))
 | 
			
		||||
        {
 | 
			
		||||
            if (add_prefix)
 | 
			
		||||
            {
 | 
			
		||||
                if (add_prefix)
 | 
			
		||||
                {
 | 
			
		||||
                    oa->write_character(static_cast<CharType>('U'));  // uint8
 | 
			
		||||
                }
 | 
			
		||||
                write_number(static_cast<uint8_t>(n));
 | 
			
		||||
                oa->write_character(static_cast<CharType>('I'));  // int16
 | 
			
		||||
            }
 | 
			
		||||
            else if (n <= (std::numeric_limits<int16_t>::max)())
 | 
			
		||||
            write_number(static_cast<int16_t>(n));
 | 
			
		||||
        }
 | 
			
		||||
        else if (n <= static_cast<uint64_t>((std::numeric_limits<int32_t>::max)()))
 | 
			
		||||
        {
 | 
			
		||||
            if (add_prefix)
 | 
			
		||||
            {
 | 
			
		||||
                if (add_prefix)
 | 
			
		||||
                {
 | 
			
		||||
                    oa->write_character(static_cast<CharType>('I'));  // int16
 | 
			
		||||
                }
 | 
			
		||||
                write_number(static_cast<int16_t>(n));
 | 
			
		||||
                oa->write_character(static_cast<CharType>('l'));  // int32
 | 
			
		||||
            }
 | 
			
		||||
            else if (n <= (std::numeric_limits<int32_t>::max)())
 | 
			
		||||
            write_number(static_cast<int32_t>(n));
 | 
			
		||||
        }
 | 
			
		||||
        else if (n <= static_cast<uint64_t>((std::numeric_limits<int64_t>::max)()))
 | 
			
		||||
        {
 | 
			
		||||
            if (add_prefix)
 | 
			
		||||
            {
 | 
			
		||||
                if (add_prefix)
 | 
			
		||||
                {
 | 
			
		||||
                    oa->write_character(static_cast<CharType>('l'));  // int32
 | 
			
		||||
                }
 | 
			
		||||
                write_number(static_cast<int32_t>(n));
 | 
			
		||||
            }
 | 
			
		||||
            else if (n <= (std::numeric_limits<int64_t>::max)())
 | 
			
		||||
            {
 | 
			
		||||
                if (add_prefix)
 | 
			
		||||
                {
 | 
			
		||||
                    oa->write_character(static_cast<CharType>('L'));  // int64
 | 
			
		||||
                }
 | 
			
		||||
                write_number(static_cast<int64_t>(n));
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                JSON_THROW(out_of_range::create(407, "number overflow serializing " + std::to_string(n)));
 | 
			
		||||
                oa->write_character(static_cast<CharType>('L'));  // int64
 | 
			
		||||
            }
 | 
			
		||||
            write_number(static_cast<int64_t>(n));
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            if ((std::numeric_limits<int8_t>::min)() <= n and n <= (std::numeric_limits<int8_t>::max)())
 | 
			
		||||
            {
 | 
			
		||||
                if (add_prefix)
 | 
			
		||||
                {
 | 
			
		||||
                    oa->write_character(static_cast<CharType>('i'));  // int8
 | 
			
		||||
                }
 | 
			
		||||
                write_number(static_cast<int8_t>(n));
 | 
			
		||||
            }
 | 
			
		||||
            else if ((std::numeric_limits<uint8_t>::min)() <= n and n <= (std::numeric_limits<uint8_t>::max)())
 | 
			
		||||
            {
 | 
			
		||||
                if (add_prefix)
 | 
			
		||||
                {
 | 
			
		||||
                    oa->write_character(static_cast<CharType>('U'));  // uint8
 | 
			
		||||
                }
 | 
			
		||||
                write_number(static_cast<uint8_t>(n));
 | 
			
		||||
            }
 | 
			
		||||
            else if ((std::numeric_limits<int16_t>::min)() <= n and n <= (std::numeric_limits<int16_t>::max)())
 | 
			
		||||
            {
 | 
			
		||||
                if (add_prefix)
 | 
			
		||||
                {
 | 
			
		||||
                    oa->write_character(static_cast<CharType>('I'));  // int16
 | 
			
		||||
                }
 | 
			
		||||
                write_number(static_cast<int16_t>(n));
 | 
			
		||||
            }
 | 
			
		||||
            else if ((std::numeric_limits<int32_t>::min)() <= n and n <= (std::numeric_limits<int32_t>::max)())
 | 
			
		||||
            {
 | 
			
		||||
                if (add_prefix)
 | 
			
		||||
                {
 | 
			
		||||
                    oa->write_character(static_cast<CharType>('l'));  // int32
 | 
			
		||||
                }
 | 
			
		||||
                write_number(static_cast<int32_t>(n));
 | 
			
		||||
            }
 | 
			
		||||
            else if ((std::numeric_limits<int64_t>::min)() <= n and n <= (std::numeric_limits<int64_t>::max)())
 | 
			
		||||
            {
 | 
			
		||||
                if (add_prefix)
 | 
			
		||||
                {
 | 
			
		||||
                    oa->write_character(static_cast<CharType>('L'));  // int64
 | 
			
		||||
                }
 | 
			
		||||
                write_number(static_cast<int64_t>(n));
 | 
			
		||||
            }
 | 
			
		||||
            // LCOV_EXCL_START
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                JSON_THROW(out_of_range::create(407, "number overflow serializing " + std::to_string(n)));
 | 
			
		||||
            }
 | 
			
		||||
            // LCOV_EXCL_STOP
 | 
			
		||||
            JSON_THROW(out_of_range::create(407, "number overflow serializing " + std::to_string(n)));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // UBJSON: write number (signed integer)
 | 
			
		||||
    template<typename NumberType, typename std::enable_if<
 | 
			
		||||
                 std::is_signed<NumberType>::value and
 | 
			
		||||
                 not std::is_floating_point<NumberType>::value, int>::type = 0>
 | 
			
		||||
    void write_number_with_ubjson_prefix(const NumberType n,
 | 
			
		||||
                                         const bool add_prefix)
 | 
			
		||||
    {
 | 
			
		||||
        if ((std::numeric_limits<int8_t>::min)() <= n and n <= (std::numeric_limits<int8_t>::max)())
 | 
			
		||||
        {
 | 
			
		||||
            if (add_prefix)
 | 
			
		||||
            {
 | 
			
		||||
                oa->write_character(static_cast<CharType>('i'));  // int8
 | 
			
		||||
            }
 | 
			
		||||
            write_number(static_cast<int8_t>(n));
 | 
			
		||||
        }
 | 
			
		||||
        else if (static_cast<int64_t>((std::numeric_limits<uint8_t>::min)()) <= n and n <= static_cast<int64_t>((std::numeric_limits<uint8_t>::max)()))
 | 
			
		||||
        {
 | 
			
		||||
            if (add_prefix)
 | 
			
		||||
            {
 | 
			
		||||
                oa->write_character(static_cast<CharType>('U'));  // uint8
 | 
			
		||||
            }
 | 
			
		||||
            write_number(static_cast<uint8_t>(n));
 | 
			
		||||
        }
 | 
			
		||||
        else if ((std::numeric_limits<int16_t>::min)() <= n and n <= (std::numeric_limits<int16_t>::max)())
 | 
			
		||||
        {
 | 
			
		||||
            if (add_prefix)
 | 
			
		||||
            {
 | 
			
		||||
                oa->write_character(static_cast<CharType>('I'));  // int16
 | 
			
		||||
            }
 | 
			
		||||
            write_number(static_cast<int16_t>(n));
 | 
			
		||||
        }
 | 
			
		||||
        else if ((std::numeric_limits<int32_t>::min)() <= n and n <= (std::numeric_limits<int32_t>::max)())
 | 
			
		||||
        {
 | 
			
		||||
            if (add_prefix)
 | 
			
		||||
            {
 | 
			
		||||
                oa->write_character(static_cast<CharType>('l'));  // int32
 | 
			
		||||
            }
 | 
			
		||||
            write_number(static_cast<int32_t>(n));
 | 
			
		||||
        }
 | 
			
		||||
        else if ((std::numeric_limits<int64_t>::min)() <= n and n <= (std::numeric_limits<int64_t>::max)())
 | 
			
		||||
        {
 | 
			
		||||
            if (add_prefix)
 | 
			
		||||
            {
 | 
			
		||||
                oa->write_character(static_cast<CharType>('L'));  // int64
 | 
			
		||||
            }
 | 
			
		||||
            write_number(static_cast<int64_t>(n));
 | 
			
		||||
        }
 | 
			
		||||
        // LCOV_EXCL_START
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            JSON_THROW(out_of_range::create(407, "number overflow serializing " + std::to_string(n)));
 | 
			
		||||
        }
 | 
			
		||||
        // LCOV_EXCL_STOP
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /*!
 | 
			
		||||
    @brief determine the type prefix of container values
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue