From 29f38237c63916710515b7d18060443fab6a4911 Mon Sep 17 00:00:00 2001 From: Saket Patel Date: Sun, 14 Jul 2024 12:12:04 +0530 Subject: [PATCH] fix(string-seq): equal(..) and hash(...) now consider all seqs with same characters --- compiler+runtime/include/cpp/jank/hash.hpp | 1 + .../include/cpp/jank/runtime/detail/type.hpp | 1 + .../obj/persistent_string_sequence.hpp | 4 +- compiler+runtime/src/cpp/jank/hash.cpp | 5 +++ .../cpp/jank/runtime/detail/object_util.cpp | 13 ++++++- .../src/cpp/jank/runtime/obj/character.cpp | 2 +- .../obj/persistent_string_sequence.cpp | 38 +++++-------------- 7 files changed, 31 insertions(+), 33 deletions(-) diff --git a/compiler+runtime/include/cpp/jank/hash.hpp b/compiler+runtime/include/cpp/jank/hash.hpp index def4877c9..d755c5ca1 100644 --- a/compiler+runtime/include/cpp/jank/hash.hpp +++ b/compiler+runtime/include/cpp/jank/hash.hpp @@ -29,6 +29,7 @@ namespace jank::hash uint32_t string(native_persistent_string_view const &input); uint32_t visit(runtime::object const * const o); + uint32_t visit(char const ch); uint32_t ordered(runtime::object const * const sequence); uint32_t unordered(runtime::object const * const sequence); diff --git a/compiler+runtime/include/cpp/jank/runtime/detail/type.hpp b/compiler+runtime/include/cpp/jank/runtime/detail/type.hpp index 0c1358d48..b58ae2180 100644 --- a/compiler+runtime/include/cpp/jank/runtime/detail/type.hpp +++ b/compiler+runtime/include/cpp/jank/runtime/detail/type.hpp @@ -12,6 +12,7 @@ namespace jank::runtime::detail { + bool equal(char const lhs, object_ptr const rhs); native_bool equal(object_ptr const lhs, object_ptr const rhs); struct object_ptr_equal diff --git a/compiler+runtime/include/cpp/jank/runtime/obj/persistent_string_sequence.hpp b/compiler+runtime/include/cpp/jank/runtime/obj/persistent_string_sequence.hpp index bf2418918..8a5853d70 100644 --- a/compiler+runtime/include/cpp/jank/runtime/obj/persistent_string_sequence.hpp +++ b/compiler+runtime/include/cpp/jank/runtime/obj/persistent_string_sequence.hpp @@ -16,8 +16,8 @@ namespace jank::runtime static_object() = default; static_object(static_object &&) = default; static_object(static_object const &) = default; - static_object(obj::persistent_string_ptr s); - static_object(obj::persistent_string_ptr s, size_t i); + static_object(obj::persistent_string_ptr const s); + static_object(obj::persistent_string_ptr const s, size_t const i); /* behavior::objectable */ native_bool equal(object const &) const; diff --git a/compiler+runtime/src/cpp/jank/hash.cpp b/compiler+runtime/src/cpp/jank/hash.cpp index e9997ebb4..fe245b362 100644 --- a/compiler+runtime/src/cpp/jank/hash.cpp +++ b/compiler+runtime/src/cpp/jank/hash.cpp @@ -145,6 +145,11 @@ namespace jank::hash return fmix(h1, 2 * length); } + uint32_t visit(char const ch) + { + return static_cast(ch); + } + uint32_t visit(runtime::object const * const o) { assert(o); diff --git a/compiler+runtime/src/cpp/jank/runtime/detail/object_util.cpp b/compiler+runtime/src/cpp/jank/runtime/detail/object_util.cpp index b46229ac7..a4e7e03ee 100644 --- a/compiler+runtime/src/cpp/jank/runtime/detail/object_util.cpp +++ b/compiler+runtime/src/cpp/jank/runtime/detail/object_util.cpp @@ -9,7 +9,7 @@ namespace jank::runtime::detail void to_string(char const ch, fmt::memory_buffer &buff) { - make_box(ch)->to_string(buff); + obj::character{ ch }.to_string(buff); } void to_string(object_ptr const o, fmt::memory_buffer &buff) @@ -35,6 +35,17 @@ namespace jank::runtime::detail o); } + bool equal(char const lhs, object_ptr const rhs) + { + if(!rhs || rhs->type != object_type::character) + { + return false; + } + + auto const typed_rhs = expect_object(rhs); + return typed_rhs->to_hash() == static_cast(lhs); + } + bool equal(object_ptr const lhs, object_ptr const rhs) { if(!lhs) diff --git a/compiler+runtime/src/cpp/jank/runtime/obj/character.cpp b/compiler+runtime/src/cpp/jank/runtime/obj/character.cpp index ce0edd223..2d6f8148d 100644 --- a/compiler+runtime/src/cpp/jank/runtime/obj/character.cpp +++ b/compiler+runtime/src/cpp/jank/runtime/obj/character.cpp @@ -90,6 +90,6 @@ namespace jank::runtime native_hash obj::character::to_hash() const { - return static_cast(get_char_from_repr(data).unwrap()); + return hash::visit(get_char_from_repr(data).unwrap()); } } diff --git a/compiler+runtime/src/cpp/jank/runtime/obj/persistent_string_sequence.cpp b/compiler+runtime/src/cpp/jank/runtime/obj/persistent_string_sequence.cpp index 9b69922a8..5e902f2dc 100644 --- a/compiler+runtime/src/cpp/jank/runtime/obj/persistent_string_sequence.cpp +++ b/compiler+runtime/src/cpp/jank/runtime/obj/persistent_string_sequence.cpp @@ -2,60 +2,40 @@ namespace jank::runtime { - obj::persistent_string_sequence::static_object(obj::persistent_string_ptr s) + obj::persistent_string_sequence::static_object(obj::persistent_string_ptr const s) : str{ s } { - assert(s->count() > 0); + assert(!s->data.empty()); } - obj::persistent_string_sequence::static_object(obj::persistent_string_ptr s, size_t i) + obj::persistent_string_sequence::static_object(obj::persistent_string_ptr const s, size_t const i) : str{ s } , index{ i } { - assert(s->count() > 0); + assert(!s->data.empty() && i < s->data.size()); } /* behavior::objectable */ native_bool obj::persistent_string_sequence::equal(object const &o) const { - if(o.type != object_type::persistent_string_sequence) - { - return false; - } - auto const seq(expect_object(&o)); - return std::equal(str->data.begin() + index, - str->data.end(), - seq->str->data.begin() + seq->index, - seq->str->data.end()); + return detail::equal(o, str->data.begin(), str->data.end()); } void obj::persistent_string_sequence::to_string(fmt::memory_buffer &buff) const { - return behavior::detail::to_string( - str->data.begin() - + static_cast(index), - str->data.end(), - "(", - ')', - buff); + return behavior::detail::to_string(str->data.begin() + index, str->data.end(), "(", ')', buff); } native_persistent_string obj::persistent_string_sequence::to_string() const { fmt::memory_buffer buff; - behavior::detail::to_string( - str->data.begin() - + static_cast(index), - str->data.end(), - "(", - ')', - buff); + behavior::detail::to_string(str->data.begin() + index, str->data.end(), "(", ')', buff); return { buff.data(), buff.size() }; } native_hash obj::persistent_string_sequence::to_hash() const { - return str->data.substr(index).to_hash(); + return hash::ordered(str->data.begin(), str->data.end()); } /* behavior::countable */ @@ -72,7 +52,7 @@ namespace jank::runtime obj::persistent_string_sequence_ptr obj::persistent_string_sequence::fresh_seq() const { - return jank::make_box(str, index); + return make_box(str, index); } /* behavior::sequenceable */