Skip to content

Commit

Permalink
runtime: Allow use of Jakt traits in DynamicArray for comparisons etc
Browse files Browse the repository at this point in the history
  • Loading branch information
alimpfard committed Dec 15, 2024
1 parent 7c1a26b commit eb2a485
Showing 1 changed file with 20 additions and 2 deletions.
22 changes: 20 additions & 2 deletions runtime/Builtins/DynamicArray.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,24 @@ using namespace Jakt;
template<typename T>
class ArraySlice;

template<typename T>
struct JaktObjectTraits : public Traits<T> {
ALWAYS_INLINE static constexpr bool equals(T const& a, T const& b) {
if constexpr (requires { { a.equals(b) } -> SameAs<bool>; })
return a.equals(b);
else
return a == b;
}

ALWAYS_INLINE static constexpr unsigned hash(T value)
{
if constexpr (requires { { value.hash() } -> SameAs<u32>; })
return value.hash();
else
return Traits<T>::hash(value);
}
};

template<typename T>
class DynamicArrayStorage : public RefCounted<DynamicArrayStorage<T>> {
public:
Expand Down Expand Up @@ -69,7 +87,7 @@ class DynamicArrayStorage : public RefCounted<DynamicArrayStorage<T>> {
bool contains(T const& value) const
{
for (size_t i = 0; i < m_size; ++i) {
if (Traits<T>::equals(m_elements[i], value)) {
if (JaktObjectTraits<T>::equals(m_elements[i], value)) {
return true;
}
}
Expand Down Expand Up @@ -436,7 +454,7 @@ class ArraySlice {
bool contains(T const& value) const
{
for (size_t i = 0; i < m_size; ++i) {
if (Traits<T>::equals(at(i), value)) {
if (JaktObjectTraits<T>::equals(at(i), value)) {
return true;
}
}
Expand Down

0 comments on commit eb2a485

Please sign in to comment.