@@ -166,6 +166,12 @@ typedef enum
166
166
TermGreaterThan = 4
167
167
} TermCompareResult ;
168
168
169
+ typedef enum
170
+ {
171
+ TermPositiveInteger = 0 ,
172
+ TermNegativeInteger = TERM_BOXED_INTEGER_SIGN_BIT
173
+ } term_integer_sign_t ;
174
+
169
175
#define TERM_MAP_NOT_FOUND -1
170
176
#define TERM_MAP_MEMORY_ALLOC_FAIL -2
171
177
@@ -768,6 +774,76 @@ static inline term term_from_int(avm_int_t value)
768
774
return (value << 4 ) | 0xF ;
769
775
}
770
776
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
+
771
847
static inline avm_int_t term_unbox_int (term boxed_int )
772
848
{
773
849
TERM_DEBUG_ASSERT (term_is_boxed_integer (boxed_int ));
0 commit comments