Skip to content

Commit 983fadb

Browse files
Add comparison operations for fine::Term (#10)
1 parent d0e7a1c commit 983fadb

File tree

4 files changed

+104
-0
lines changed

4 files changed

+104
-0
lines changed

c_include/fine.hpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,36 @@ class Term {
142142
ERL_NIF_TERM term;
143143
};
144144

145+
inline static bool operator==(const fine::Term &lhs,
146+
const fine::Term &rhs) noexcept {
147+
return enif_compare(lhs, rhs) == 0;
148+
}
149+
150+
inline static bool operator!=(const fine::Term &lhs,
151+
const fine::Term &rhs) noexcept {
152+
return enif_compare(lhs, rhs) != 0;
153+
}
154+
155+
inline static bool operator<(const fine::Term &lhs,
156+
const fine::Term &rhs) noexcept {
157+
return enif_compare(lhs, rhs) < 0;
158+
}
159+
160+
inline static bool operator<=(const fine::Term &lhs,
161+
const fine::Term &rhs) noexcept {
162+
return enif_compare(lhs, rhs) <= 0;
163+
}
164+
165+
inline static bool operator>(const fine::Term &lhs,
166+
const fine::Term &rhs) noexcept {
167+
return enif_compare(lhs, rhs) > 0;
168+
}
169+
170+
inline static bool operator>=(const fine::Term &lhs,
171+
const fine::Term &rhs) noexcept {
172+
return enif_compare(lhs, rhs) >= 0;
173+
}
174+
145175
// Represents a `:ok` tagged tuple, useful as a NIF result.
146176
template <typename... Args> class Ok {
147177
public:

test/c_src/finest.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,35 @@ std::nullopt_t shared_mutex_shared_lock_test(ErlNifEnv *) {
325325
}
326326
FINE_NIF(shared_mutex_shared_lock_test, 0);
327327

328+
bool compare_eq(ErlNifEnv *, fine::Term lhs, fine::Term rhs) noexcept {
329+
return lhs == rhs;
330+
}
331+
FINE_NIF(compare_eq, 0);
332+
333+
bool compare_ne(ErlNifEnv *, fine::Term lhs, fine::Term rhs) noexcept {
334+
return lhs != rhs;
335+
}
336+
FINE_NIF(compare_ne, 0);
337+
338+
bool compare_lt(ErlNifEnv *, fine::Term lhs, fine::Term rhs) noexcept {
339+
return lhs < rhs;
340+
}
341+
FINE_NIF(compare_lt, 0);
342+
343+
bool compare_le(ErlNifEnv *, fine::Term lhs, fine::Term rhs) noexcept {
344+
return lhs <= rhs;
345+
}
346+
FINE_NIF(compare_le, 0);
347+
348+
bool compare_gt(ErlNifEnv *, fine::Term lhs, fine::Term rhs) noexcept {
349+
return lhs > rhs;
350+
}
351+
FINE_NIF(compare_gt, 0);
352+
353+
bool compare_ge(ErlNifEnv *, fine::Term lhs, fine::Term rhs) noexcept {
354+
return lhs >= rhs;
355+
}
356+
FINE_NIF(compare_ge, 0);
328357
} // namespace finest
329358

330359
FINE_INIT("Elixir.Finest.NIF");

test/lib/finest/nif.ex

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,5 +59,12 @@ defmodule Finest.NIF do
5959
def shared_mutex_unique_lock_test(), do: err!()
6060
def shared_mutex_shared_lock_test(), do: err!()
6161

62+
def compare_eq(_lhs, _rhs), do: err!()
63+
def compare_ne(_lhs, _rhs), do: err!()
64+
def compare_lt(_lhs, _rhs), do: err!()
65+
def compare_le(_lhs, _rhs), do: err!()
66+
def compare_gt(_lhs, _rhs), do: err!()
67+
def compare_ge(_lhs, _rhs), do: err!()
68+
6269
defp err!(), do: :erlang.nif_error(:not_loaded)
6370
end

test/test/finest_test.exs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,4 +313,42 @@ defmodule FinestTest do
313313
NIF.shared_mutex_shared_lock_test()
314314
end
315315
end
316+
317+
describe "comparison" do
318+
test "equal" do
319+
refute NIF.compare_eq(64, 42)
320+
refute NIF.compare_eq(nil, %{})
321+
assert NIF.compare_eq("fine", "fine")
322+
end
323+
324+
test "not equal" do
325+
assert NIF.compare_ne(64, 42)
326+
assert NIF.compare_ne(nil, %{})
327+
refute NIF.compare_ne("fine", "fine")
328+
end
329+
330+
test "less than" do
331+
refute NIF.compare_lt(64, 42)
332+
assert NIF.compare_lt(nil, %{})
333+
refute NIF.compare_lt("fine", "fine")
334+
end
335+
336+
test "less than equal" do
337+
refute NIF.compare_le(64, 42)
338+
assert NIF.compare_le(nil, %{})
339+
assert NIF.compare_le("fine", "fine")
340+
end
341+
342+
test "greater than" do
343+
assert NIF.compare_gt(64, 42)
344+
refute NIF.compare_gt(nil, %{})
345+
refute NIF.compare_gt("fine", "fine")
346+
end
347+
348+
test "greater than equal" do
349+
assert NIF.compare_ge(64, 42)
350+
refute NIF.compare_ge(nil, %{})
351+
assert NIF.compare_ge("fine", "fine")
352+
end
353+
end
316354
end

0 commit comments

Comments
 (0)