Skip to content

Commit

Permalink
Ensure that the AbslStringify() path of writing is not used for str…
Browse files Browse the repository at this point in the history
…ing-like

types which have dedicated functions, even if it would be a better match than
the dedicated functions e.g. because of implicit conversions.

PiperOrigin-RevId: 605618065
  • Loading branch information
QrczakMK committed Feb 9, 2024
1 parent 1b9ac9f commit cc1f7b2
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 11 deletions.
22 changes: 19 additions & 3 deletions riegeli/bytes/backward_writer.h
Original file line number Diff line number Diff line change
Expand Up @@ -193,8 +193,16 @@ class BackwardWriter : public Object {
bool Write(float src);
bool Write(double src);
bool Write(long double src);
template <typename Src,
std::enable_if_t<HasAbslStringify<Src>::value, int> = 0>
template <
typename Src,
std::enable_if_t<
absl::conjunction<
HasAbslStringify<Src>,
absl::negation<std::is_convertible<Src&&, absl::string_view>>,
absl::negation<std::is_convertible<Src&&, const Chain&>>,
absl::negation<std::is_convertible<Src&&, const absl::Cord&>>>::
value,
int> = 0>
bool Write(Src&& src);

// Other integer types are is not supported. Delete overloads to avoid
Expand Down Expand Up @@ -742,7 +750,15 @@ inline bool BackwardWriter::Write(absl::uint128 src) {
return write_int_internal::WriteUnsigned(src, *this);
}

template <typename Src, std::enable_if_t<HasAbslStringify<Src>::value, int>>
template <typename Src,
std::enable_if_t<
absl::conjunction<
HasAbslStringify<Src>,
absl::negation<std::is_convertible<Src&&, absl::string_view>>,
absl::negation<std::is_convertible<Src&&, const Chain&>>,
absl::negation<
std::is_convertible<Src&&, const absl::Cord&>>>::value,
int>>
inline bool BackwardWriter::Write(Src&& src) {
RestrictedChainWriter chain_writer;
WriterAbslStringifySink sink(&chain_writer);
Expand Down
34 changes: 29 additions & 5 deletions riegeli/bytes/writer.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,16 @@ void StringifiedSize(absl::uint128 src);
void StringifiedSize(float);
void StringifiedSize(double);
void StringifiedSize(long double);
template <typename Src, std::enable_if_t<HasAbslStringify<Src>::value, int> = 0>
void StringifiedSize(const Src&);
template <typename Src,
std::enable_if_t<
absl::conjunction<
HasAbslStringify<Src>,
absl::negation<std::is_convertible<Src&&, absl::string_view>>,
absl::negation<std::is_convertible<Src&&, const Chain&>>,
absl::negation<
std::is_convertible<Src&&, const absl::Cord&>>>::value,
int> = 0>
void StringifiedSize(Src&&);
void StringifiedSize(bool) = delete;
void StringifiedSize(wchar_t) = delete;
void StringifiedSize(char16_t) = delete;
Expand Down Expand Up @@ -298,8 +306,16 @@ class Writer : public Object {
bool Write(float src);
bool Write(double src);
bool Write(long double src);
template <typename Src,
std::enable_if_t<HasAbslStringify<Src>::value, int> = 0>
template <
typename Src,
std::enable_if_t<
absl::conjunction<
HasAbslStringify<Src>,
absl::negation<std::is_convertible<Src&&, absl::string_view>>,
absl::negation<std::is_convertible<Src&&, const Chain&>>,
absl::negation<std::is_convertible<Src&&, const absl::Cord&>>>::
value,
int> = 0>
bool Write(Src&& src);

// Other integer types are is not supported. Delete overloads to avoid
Expand Down Expand Up @@ -955,7 +971,15 @@ inline bool Writer::Write(absl::uint128 src) {
return write_int_internal::WriteUnsigned(src, *this);
}

template <typename Src, std::enable_if_t<HasAbslStringify<Src>::value, int>>
template <typename Src,
std::enable_if_t<
absl::conjunction<
HasAbslStringify<Src>,
absl::negation<std::is_convertible<Src&&, absl::string_view>>,
absl::negation<std::is_convertible<Src&&, const Chain&>>,
absl::negation<
std::is_convertible<Src&&, const absl::Cord&>>>::value,
int>>
inline bool Writer::Write(Src&& src) {
WriterAbslStringifySink sink(this);
AbslStringify(sink, std::forward<Src>(src));
Expand Down
22 changes: 19 additions & 3 deletions riegeli/digests/digester.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,16 @@ class DigesterBase {
void Write(const char* src) { Write(absl::string_view(src)); }
void Write(const Chain& src);
void Write(const absl::Cord& src);
template <typename Src,
std::enable_if_t<HasAbslStringify<Src>::value, int> = 0>
template <
typename Src,
std::enable_if_t<
absl::conjunction<
HasAbslStringify<Src>,
absl::negation<std::is_convertible<Src&&, absl::string_view>>,
absl::negation<std::is_convertible<Src&&, const Chain&>>,
absl::negation<std::is_convertible<Src&&, const absl::Cord&>>>::
value,
int> = 0>
void Write(Src&& src);

// Numeric types supported by `Writer::Write()` are not supported by
Expand Down Expand Up @@ -318,7 +326,15 @@ class DigesterBase::DigesterAbslStringifySink {
DigesterBase* digester_;
};

template <typename Src, std::enable_if_t<HasAbslStringify<Src>::value, int>>
template <typename Src,
std::enable_if_t<
absl::conjunction<
HasAbslStringify<Src>,
absl::negation<std::is_convertible<Src&&, absl::string_view>>,
absl::negation<std::is_convertible<Src&&, const Chain&>>,
absl::negation<
std::is_convertible<Src&&, const absl::Cord&>>>::value,
int>>
inline void DigesterBase::Write(Src&& src) {
DigesterAbslStringifySink sink(this);
AbslStringify(sink, std::forward<Src>(src));
Expand Down

0 comments on commit cc1f7b2

Please sign in to comment.