OILS / mycpp / comparators.h View on Github | oilshell.org

65 lines, 38 significant
1#ifndef MYCPP_COMPARATORS_H
2#define MYCPP_COMPARATORS_H
3
4#include <string.h> // memcmp
5
6#include <algorithm> // std::min()
7
8#include "mycpp/gc_str.h" // len()
9
10template <typename L, typename R>
11class Tuple2;
12
13bool str_equals(BigStr* left, BigStr* right);
14bool maybe_str_equals(BigStr* left, BigStr* right);
15
16bool are_equal(BigStr* left, BigStr* right);
17
18bool are_equal(BigStr* left, BigStr* right);
19bool are_equal(int left, int right);
20bool are_equal(Tuple2<BigStr*, int>* t1, Tuple2<BigStr*, int>* t2);
21bool are_equal(Tuple2<int, int>* t1, Tuple2<int, int>* t2);
22
23bool keys_equal(int left, int right);
24bool keys_equal(BigStr* left, BigStr* right);
25bool keys_equal(Tuple2<int, int>* t1, Tuple2<int, int>* t2);
26bool keys_equal(Tuple2<BigStr*, int>* t1, Tuple2<BigStr*, int>* t2);
27
28namespace id_kind_asdl {
29enum class Kind;
30};
31
32bool are_equal(id_kind_asdl::Kind left, id_kind_asdl::Kind right);
33
34inline int int_cmp(int a, int b) {
35 if (a == b) {
36 return 0;
37 }
38 return a < b ? -1 : 1;
39}
40
41// mylib::str_cmp is in this common header to avoid gc_list.h -> gc_mylib.h
42// dependency
43//
44// It's also used for _cmp(BigStr*) in gc_list.
45namespace mylib {
46
47// Used by [[ a > b ]] and so forth
48inline int str_cmp(BigStr* a, BigStr* b) {
49 int len_a = len(a);
50 int len_b = len(b);
51
52 int min = std::min(len_a, len_b);
53 if (min == 0) {
54 return int_cmp(len_a, len_b);
55 }
56 int comp = memcmp(a->data_, b->data_, min);
57 if (comp == 0) {
58 return int_cmp(len_a, len_b); // tiebreaker
59 }
60 return comp;
61}
62
63} // namespace mylib
64
65#endif // MYCPP_COMPARATORS_H