mirror of
https://github.com/KingDuckZ/incredis
synced 2024-11-27 00:43:50 +00:00
Use the new int_conv instead of the old lexical_cast.
This commit is contained in:
parent
a70cbd736d
commit
39cfbada85
8 changed files with 120 additions and 30 deletions
95
include/incredis/int_conv.hpp
Normal file
95
include/incredis/int_conv.hpp
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
/* Copyright 2016-2018, Michele Santullo
|
||||||
|
* This file is part of "incredis".
|
||||||
|
*
|
||||||
|
* "incredis" is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* "incredis" is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with "incredis". If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef id08E89EF0951741388A48A79E769C646C
|
||||||
|
#define id08E89EF0951741388A48A79E769C646C
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include "duckhandy/implem/int_conv.hpp"
|
||||||
|
|
||||||
|
namespace redis {
|
||||||
|
namespace implem {
|
||||||
|
struct AsciiTranslator {
|
||||||
|
static const constexpr bool BehavesLikeASCII = true;
|
||||||
|
static const constexpr char FirstDigit = '0';
|
||||||
|
static const constexpr char FirstLetter = 'a';
|
||||||
|
static const constexpr char Plus = '+';
|
||||||
|
static const constexpr char Minus = '-';
|
||||||
|
|
||||||
|
static constexpr char to_digit (unsigned int num) {
|
||||||
|
return (num <= 9 ? static_cast<char>(num + '0') : static_cast<char>(num + 'a'));
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr int from_digit (char digit) {
|
||||||
|
if (digit >= '0' and digit <= '9')
|
||||||
|
return digit - '0';
|
||||||
|
else if (digit >= 'a' and digit <= 'z')
|
||||||
|
return digit - 'a';
|
||||||
|
else if (digit >= 'A' and digit <= 'Z')
|
||||||
|
return digit - 'A';
|
||||||
|
else
|
||||||
|
throw std::domain_error(
|
||||||
|
std::string("Can't convert invalid character '") +
|
||||||
|
digit + "' (" +
|
||||||
|
std::to_string(static_cast<int>(digit)) +
|
||||||
|
") to a number"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T, typename F>
|
||||||
|
struct IntConv;
|
||||||
|
|
||||||
|
template <typename F>
|
||||||
|
struct IntConv<std::enable_if_t<std::is_integral_v<F>, std::string>, F> {
|
||||||
|
static std::string conv (const F& in) {
|
||||||
|
auto retval = dhandy::int_to_ary<F, 10, AsciiTranslator>(in);
|
||||||
|
return std::string(retval.begin(), retval.end() - 1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
template <typename T>
|
||||||
|
struct IntConv<T, std::enable_if_t<std::is_integral_v<T>, std::string>> {
|
||||||
|
static T conv (const std::string& in) {
|
||||||
|
return dhandy::ary_to_int<T, char, 10, AsciiTranslator>(in.data(), in.data() + in.size());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
template <typename T>
|
||||||
|
struct IntConv<T, std::enable_if_t<std::is_integral_v<T>, std::string_view>> {
|
||||||
|
static T conv (const std::string_view& in) {
|
||||||
|
return dhandy::ary_to_int<T, char, 10, AsciiTranslator>(in.data(), in.data() + in.size());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} //namespace implem
|
||||||
|
|
||||||
|
template <typename To, typename From>
|
||||||
|
inline To int_conv (const From& from) {
|
||||||
|
return implem::IntConv<To, From>::conv(from);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename From>
|
||||||
|
constexpr inline auto int_to_ary_hex (From f) {
|
||||||
|
return dhandy::int_to_ary<From, 16>(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename From>
|
||||||
|
constexpr inline auto int_to_ary_dec (From f) {
|
||||||
|
return dhandy::int_to_ary<From, 10>(f);
|
||||||
|
}
|
||||||
|
} //namespace redis
|
||||||
|
|
||||||
|
#endif
|
|
@ -19,7 +19,7 @@
|
||||||
#define id5B30CDA57F894CD6888093B64F9433DA
|
#define id5B30CDA57F894CD6888093B64F9433DA
|
||||||
|
|
||||||
#include "batch.hpp"
|
#include "batch.hpp"
|
||||||
#include "duckhandy/lexical_cast.hpp"
|
#include "incredis/int_conv.hpp"
|
||||||
#include "duckhandy/sequence_bt.hpp"
|
#include "duckhandy/sequence_bt.hpp"
|
||||||
#include <boost/utility/string_view.hpp>
|
#include <boost/utility/string_view.hpp>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
@ -73,7 +73,7 @@ namespace redis {
|
||||||
parBatch.run(
|
parBatch.run(
|
||||||
"EVALSHA",
|
"EVALSHA",
|
||||||
m_sha1,
|
m_sha1,
|
||||||
dhandy::lexical_cast<std::string>(sizeof...(Keys)),
|
int_conv<std::string>(sizeof...(Keys)),
|
||||||
std::get<KeyIndices>(parKeys)...,
|
std::get<KeyIndices>(parKeys)...,
|
||||||
std::get<ValueIndices>(parValues)...
|
std::get<ValueIndices>(parValues)...
|
||||||
);
|
);
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 7ceaf01a376e9184027850104dac4f3e3fc6b755
|
Subproject commit 4eb42094093a3eb899d6e8169959dfa8985f3cb6
|
|
@ -17,7 +17,7 @@
|
||||||
|
|
||||||
#include "incredis.hpp"
|
#include "incredis.hpp"
|
||||||
#include "duckhandy/compatibility.h"
|
#include "duckhandy/compatibility.h"
|
||||||
#include "duckhandy/lexical_cast.hpp"
|
#include "incredis/int_conv.hpp"
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <ciso646>
|
#include <ciso646>
|
||||||
|
|
||||||
|
@ -102,13 +102,12 @@ namespace redis {
|
||||||
}
|
}
|
||||||
|
|
||||||
RedisInt IncRedis::hincrby (boost::string_view parKey, boost::string_view parField, int parInc) {
|
RedisInt IncRedis::hincrby (boost::string_view parKey, boost::string_view parField, int parInc) {
|
||||||
const auto inc = dhandy::lexical_cast<std::string>(parInc);
|
auto reply = m_command.run("HINCRBY", parKey, parField, int_to_ary_dec(parInc).to<boost::string_view>());
|
||||||
auto reply = m_command.run("HINCRBY", parKey, parField, inc);
|
|
||||||
return get_integer(reply);
|
return get_integer(reply);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto IncRedis::srandmember (boost::string_view parKey, int parCount) -> opt_string_list {
|
auto IncRedis::srandmember (boost::string_view parKey, int parCount) -> opt_string_list {
|
||||||
return optional_string_list(m_command.run("SRANDMEMBER", parKey, dhandy::lexical_cast<std::string>(parCount)));
|
return optional_string_list(m_command.run("SRANDMEMBER", parKey, int_to_ary_dec(parCount).to<boost::string_view>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto IncRedis::srandmember (boost::string_view parKey) -> opt_string {
|
auto IncRedis::srandmember (boost::string_view parKey) -> opt_string {
|
||||||
|
@ -142,7 +141,7 @@ namespace redis {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IncRedis::expire (boost::string_view parKey, RedisInt parTTL) {
|
bool IncRedis::expire (boost::string_view parKey, RedisInt parTTL) {
|
||||||
const auto ret = redis::get<RedisInt>(m_command.run("EXPIRE", parKey, dhandy::lexical_cast<std::string>(parTTL)));
|
const auto ret = redis::get<RedisInt>(m_command.run("EXPIRE", parKey, int_to_ary_dec(parTTL).to<boost::string_view>()));
|
||||||
return (ret == 1 ? true : false);
|
return (ret == 1 ? true : false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "incredis_batch.hpp"
|
#include "incredis_batch.hpp"
|
||||||
#include "duckhandy/lexical_cast.hpp"
|
#include "incredis/int_conv.hpp"
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <ciso646>
|
#include <ciso646>
|
||||||
|
@ -45,7 +45,7 @@ namespace redis {
|
||||||
}
|
}
|
||||||
|
|
||||||
IncRedisBatch& IncRedisBatch::select (int parIndex) {
|
IncRedisBatch& IncRedisBatch::select (int parIndex) {
|
||||||
m_batch.run("SELECT", dhandy::lexical_cast<std::string>(parIndex));
|
m_batch.run("SELECT", int_to_ary_dec(parIndex).to<boost::string_view>());
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,12 +60,12 @@ namespace redis {
|
||||||
}
|
}
|
||||||
|
|
||||||
IncRedisBatch& IncRedisBatch::hincrby (boost::string_view parKey, boost::string_view parField, int parInc) {
|
IncRedisBatch& IncRedisBatch::hincrby (boost::string_view parKey, boost::string_view parField, int parInc) {
|
||||||
m_batch.run("HINCRBY", parKey, parField, dhandy::lexical_cast<std::string>(parInc));
|
m_batch.run("HINCRBY", parKey, parField, int_to_ary_dec(parInc).to<boost::string_view>());
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
IncRedisBatch& IncRedisBatch::srandmember (boost::string_view parKey, int parCount) {
|
IncRedisBatch& IncRedisBatch::srandmember (boost::string_view parKey, int parCount) {
|
||||||
m_batch.run("SRANDMEMBER", parKey, dhandy::lexical_cast<std::string>(parCount));
|
m_batch.run("SRANDMEMBER", parKey, int_to_ary_dec(parCount).to<boost::string_view>());
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "reply.hpp"
|
#include "reply.hpp"
|
||||||
#include "duckhandy/lexical_cast.hpp"
|
#include "incredis/int_conv.hpp"
|
||||||
#include <boost/variant/get.hpp>
|
#include <boost/variant/get.hpp>
|
||||||
|
|
||||||
namespace redis {
|
namespace redis {
|
||||||
|
@ -35,14 +35,12 @@ namespace redis {
|
||||||
}
|
}
|
||||||
|
|
||||||
RedisInt get_integer_autoconv_if_str (const Reply &parReply) {
|
RedisInt get_integer_autoconv_if_str (const Reply &parReply) {
|
||||||
using dhandy::lexical_cast;
|
|
||||||
|
|
||||||
const auto type = parReply.which();
|
const auto type = parReply.which();
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case RedisVariantType_Integer:
|
case RedisVariantType_Integer:
|
||||||
return get_integer(parReply);
|
return get_integer(parReply);
|
||||||
case RedisVariantType_String:
|
case RedisVariantType_String:
|
||||||
return lexical_cast<RedisInt>(get_string(parReply));
|
return int_conv<RedisInt>(get_string(parReply));
|
||||||
default:
|
default:
|
||||||
assert(false);
|
assert(false);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "scan_iterator.hpp"
|
#include "scan_iterator.hpp"
|
||||||
#include "duckhandy/lexical_cast.hpp"
|
#include "incredis/int_conv.hpp"
|
||||||
#include "command.hpp"
|
#include "command.hpp"
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <ciso646>
|
#include <ciso646>
|
||||||
|
@ -42,8 +42,8 @@ namespace redis {
|
||||||
}
|
}
|
||||||
|
|
||||||
Reply ScanIteratorBaseClass::run (const char* parCommand, RedisInt parScanContext, std::size_t parCount) {
|
Reply ScanIteratorBaseClass::run (const char* parCommand, RedisInt parScanContext, std::size_t parCount) {
|
||||||
const auto scan_context = dhandy::lexical_cast<std::string>(parScanContext);
|
const auto scan_context = int_conv<std::string>(parScanContext);
|
||||||
const auto count_hint = dhandy::lexical_cast<std::string>(parCount);
|
const auto count_hint = int_conv<std::string>(parCount);
|
||||||
if (m_match_pattern.empty())
|
if (m_match_pattern.empty())
|
||||||
return m_command->run(parCommand, scan_context, "COUNT", count_hint);
|
return m_command->run(parCommand, scan_context, "COUNT", count_hint);
|
||||||
else
|
else
|
||||||
|
@ -51,8 +51,8 @@ namespace redis {
|
||||||
}
|
}
|
||||||
|
|
||||||
Reply ScanIteratorBaseClass::run (const char* parCommand, const boost::string_view& parParameter, RedisInt parScanContext, std::size_t parCount) {
|
Reply ScanIteratorBaseClass::run (const char* parCommand, const boost::string_view& parParameter, RedisInt parScanContext, std::size_t parCount) {
|
||||||
const auto scan_context = dhandy::lexical_cast<std::string>(parScanContext);
|
const auto scan_context = int_conv<std::string>(parScanContext);
|
||||||
const auto count_hint = dhandy::lexical_cast<std::string>(parCount);
|
const auto count_hint = int_conv<std::string>(parCount);
|
||||||
if (m_match_pattern.empty())
|
if (m_match_pattern.empty())
|
||||||
return m_command->run(parCommand, parParameter, scan_context, "COUNT", count_hint);
|
return m_command->run(parCommand, parParameter, scan_context, "COUNT", count_hint);
|
||||||
else
|
else
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "script_manager.hpp"
|
#include "script_manager.hpp"
|
||||||
#include "duckhandy/lexical_cast.hpp"
|
#include "incredis/int_conv.hpp"
|
||||||
#include "command.hpp"
|
#include "command.hpp"
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#if defined(MAKE_SHA1_WITH_CRYPTOPP)
|
#if defined(MAKE_SHA1_WITH_CRYPTOPP)
|
||||||
|
@ -51,8 +51,6 @@ namespace redis {
|
||||||
if (parScript.empty())
|
if (parScript.empty())
|
||||||
return boost::string_view();
|
return boost::string_view();
|
||||||
|
|
||||||
using dhandy::lexical_cast;
|
|
||||||
|
|
||||||
static_assert(20 == CryptoPP::SHA1::DIGESTSIZE, "Unexpected SHA1 digest size");
|
static_assert(20 == CryptoPP::SHA1::DIGESTSIZE, "Unexpected SHA1 digest size");
|
||||||
static_assert(sizeof(LuaScriptHash) >= CryptoPP::SHA1::DIGESTSIZE, "Wrong SHA1 struct size");
|
static_assert(sizeof(LuaScriptHash) >= CryptoPP::SHA1::DIGESTSIZE, "Wrong SHA1 struct size");
|
||||||
static_assert(Sha1Array().size() == CryptoPP::SHA1::DIGESTSIZE * 2, "Wrong array size");
|
static_assert(Sha1Array().size() == CryptoPP::SHA1::DIGESTSIZE * 2, "Wrong array size");
|
||||||
|
@ -60,13 +58,13 @@ namespace redis {
|
||||||
LuaScriptHash digest;
|
LuaScriptHash digest;
|
||||||
CryptoPP::SHA1().CalculateDigest(digest.raw_bytes, reinterpret_cast<const uint8_t*>(parScript.data()), parScript.size());
|
CryptoPP::SHA1().CalculateDigest(digest.raw_bytes, reinterpret_cast<const uint8_t*>(parScript.data()), parScript.size());
|
||||||
//TODO: change when lexical_cast will support arrays
|
//TODO: change when lexical_cast will support arrays
|
||||||
auto sha1_str_parta = lexical_cast<std::string, dhandy::tags::hexl>(__builtin_bswap64(digest.part_a));
|
auto sha1_str_parta = int_to_ary_hex(__builtin_bswap64(digest.part_a));
|
||||||
auto sha1_str_partb = lexical_cast<std::string, dhandy::tags::hexl>(__builtin_bswap64(digest.part_b));
|
auto sha1_str_partb = int_to_ary_hex(__builtin_bswap64(digest.part_b));
|
||||||
auto sha1_str_partc = lexical_cast<std::string, dhandy::tags::hexl>(__builtin_bswap32(digest.part_c));
|
auto sha1_str_partc = int_to_ary_hex(__builtin_bswap32(digest.part_c));
|
||||||
const std::string sha1_str =
|
const std::string sha1_str =
|
||||||
std::string(sizeof(digest.part_a) * 2 - sha1_str_parta.size(), '0') + sha1_str_parta +
|
std::string(sizeof(digest.part_a) * 2 - sha1_str_parta.size() + 1, '0') + sha1_str_parta +
|
||||||
std::string(sizeof(digest.part_b) * 2 - sha1_str_partb.size(), '0') + sha1_str_partb +
|
std::string(sizeof(digest.part_b) * 2 - sha1_str_partb.size() + 1, '0') + sha1_str_partb +
|
||||||
std::string(sizeof(digest.part_c) * 2 - sha1_str_partc.size(), '0') + sha1_str_partc
|
std::string(sizeof(digest.part_c) * 2 - sha1_str_partc.size() + 1, '0') + sha1_str_partc
|
||||||
;
|
;
|
||||||
Sha1Array sha1_array;
|
Sha1Array sha1_array;
|
||||||
assert(sha1_str.size() == sha1_array.size());
|
assert(sha1_str.size() == sha1_array.size());
|
||||||
|
|
Loading…
Reference in a new issue