Skip to content

Commit d16b5af

Browse files
committed
term: add integer sign predicates and getter
Add functions for checking if a term is a positive integer, and etc... Function names are inspired to Erlang typespecs (such as non_neg_integer). Signed-off-by: Davide Bettio <davide@uninstall.it>
1 parent eacdc62 commit d16b5af

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

src/libAtomVM/term.h

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,12 @@ typedef enum
166166
TermGreaterThan = 4
167167
} TermCompareResult;
168168

169+
typedef enum
170+
{
171+
TermPositiveInteger = 0,
172+
TermNegativeInteger = TERM_BOXED_INTEGER_SIGN_BIT
173+
} term_integer_sign_t;
174+
169175
#define TERM_MAP_NOT_FOUND -1
170176
#define TERM_MAP_MEMORY_ALLOC_FAIL -2
171177

@@ -768,6 +774,76 @@ static inline term term_from_int(avm_int_t value)
768774
return (value << 4) | 0xF;
769775
}
770776

777+
static inline bool term_is_non_neg_integer(term t)
778+
{
779+
if (term_is_integer(t)) {
780+
avm_int_t v = term_to_int(t);
781+
return v >= 0;
782+
}
783+
return false;
784+
}
785+
786+
static inline bool term_is_pos_integer(term t)
787+
{
788+
if (term_is_integer(t)) {
789+
avm_int_t v = term_to_int(t);
790+
return v > 0;
791+
}
792+
793+
return false;
794+
}
795+
796+
static inline bool term_is_neg_integer(term t)
797+
{
798+
if (term_is_integer(t)) {
799+
avm_int_t v = term_to_int(t);
800+
return v < 0;
801+
}
802+
803+
return false;
804+
}
805+
806+
static inline bool term_is_pos_boxed_integer(term t)
807+
{
808+
if (term_is_boxed(t)) {
809+
const term *boxed_value = term_to_const_term_ptr(t);
810+
return ((boxed_value[0] & TERM_BOXED_TAG_MASK) == TERM_BOXED_POSITIVE_INTEGER);
811+
}
812+
813+
return false;
814+
}
815+
816+
static inline bool term_is_neg_boxed_integer(term t)
817+
{
818+
if (term_is_boxed(t)) {
819+
const term *boxed_value = term_to_const_term_ptr(t);
820+
return ((boxed_value[0] & TERM_BOXED_TAG_MASK) == TERM_BOXED_NEGATIVE_INTEGER);
821+
}
822+
823+
return false;
824+
}
825+
826+
static inline term_integer_sign_t term_boxed_integer_sign(term t)
827+
{
828+
const term *boxed_value = term_to_const_term_ptr(t);
829+
return (term_integer_sign_t) (boxed_value[0] & TERM_BOXED_INTEGER_SIGN_BIT);
830+
}
831+
832+
static inline bool term_is_any_non_neg_integer(term t)
833+
{
834+
return term_is_non_neg_integer(t) || term_is_pos_boxed_integer(t);
835+
}
836+
837+
static inline bool term_is_any_pos_integer(term t)
838+
{
839+
return term_is_pos_integer(t) || term_is_pos_boxed_integer(t);
840+
}
841+
842+
static inline bool term_is_any_neg_integer(term t)
843+
{
844+
return term_is_neg_integer(t) || term_is_neg_boxed_integer(t);
845+
}
846+
771847
static inline avm_int_t term_unbox_int(term boxed_int)
772848
{
773849
TERM_DEBUG_ASSERT(term_is_boxed_integer(boxed_int));

0 commit comments

Comments
 (0)