Twilight Princess
Decompilation of The Legend of Zelda: Twilight Princess
Loading...
Searching...
No Matches
search.h
Go to the documentation of this file.
1#ifndef JGADGET_SEARCH_H
2#define JGADGET_SEARCH_H
3
4#include <dolphin/types.h>
5#include <iterator>
6#include <functional>
7#include <algorithm>
8
9namespace JGadget {
10namespace search {
11template <typename T>
13
14template <>
16 static s32 get(s32 n) { return n << 3; }
17};
18
20 TPR1IsEqual_string_(const char* sz) {
21 string_ = sz;
22 }
23
24 bool operator()(const char* sz) const {
25 bool ret;
26 if (string_ == NULL) {
27 ret = sz == NULL;
28 } else {
29 ret = sz != NULL && strcmp(string_, sz) == 0;
30 }
31 return ret;
32 }
33
34 const char* string_;
35};
36
37} // namespace search
38
39const char* toStringFromIndex(int index, const char* const* pValue, u32 count, const char* fallback);
40int toIndexFromString_linear(const char*, const char* const*, u32, int);
41
42template <typename T>
43inline const T& toValueFromIndex(int idx, const T* pValue, u32 count, const T& fallback) {
44 JUT_ASSERT(200, pValue!=NULL);
45 u32 index = idx;
46 if (index >= count) {
47 return fallback;
48 } else {
49 return pValue[index];
50 }
51}
52
53template <typename T, typename Predicate>
54inline int toIndexFromValue_linear_if(Predicate p, const T* pValue, u32 count, int fallback) {
55 JUT_ASSERT(212, pValue!=NULL);
56
57 const T* first = pValue;
58 const T* last = pValue + count;
59 const T* found = std::find_if(first, last, p);
60
61 if (found == last) {
62 return fallback;
63 }
64
65 return std::distance(first, found);
66}
67
68template <typename Category, typename T, typename Distance, typename Pointer, typename Reference>
69struct TIterator : public std::iterator<Category, T, Distance, Pointer, Reference> {
70};
71
72template <typename Iterator>
73struct TIterator_reverse : public std::reverse_iterator<Iterator> {
75 TIterator_reverse(Iterator it) : std::reverse_iterator<Iterator>(it) {}
76};
77
78template <typename Iterator, typename T, typename Predicate>
79inline Iterator findUpperBound_binary_all(Iterator first, Iterator last, const T& val, Predicate p) {
80 return std::upper_bound(first, last, val, p);
81}
82
83template <typename Iterator, typename T, typename Predicate>
84inline Iterator findUpperBound_binary_begin(Iterator first, Iterator last, const T& val, Predicate p) {
85 if (first == last) {
86 return last;
87 }
88
89 typedef typename std::iterator_traits<Iterator>::difference_type difference_type;
90 difference_type dist = std::distance(first, last);
91 difference_type stride = 1;
93 Iterator i = first;
94
95 while (true) {
96 if (p(val, *i)) {
97 if (stride == 1) {
98 return i;
99 } else {
100 break;
101 }
102 }
103 first = i;
104 dist -= stride;
105 if (dist <= 0) {
106 i = last;
107 break;
108 }
109 i += stride;
110 stride = expand.get(stride);
111 }
112
113 return findUpperBound_binary_all(first, i, val, p);
114}
115
116template <typename Iterator, typename T, typename Predicate>
117inline Iterator findUpperBound_binary_end(Iterator first, Iterator last, const T& val, Predicate p) {
118 if (first == last) {
119 return last;
120 }
121
122 typedef typename std::iterator_traits<Iterator>::difference_type difference_type;
123 --last;
124 difference_type dist = std::distance(first, last);
125 difference_type stride = 1;
127 Iterator i = last;
128
129 while (true) {
130 if (!p(val, *i)) {
131 if (stride == 1) {
132 return ++i;
133 } else {
134 break;
135 }
136 }
137 last = i;
138 dist -= stride;
139 if (dist <= 0) {
140 i = first;
141 break;
142 }
143 i -= stride;
144 stride = expand.get(stride);
145 }
146
147 return findUpperBound_binary_all(i, ++last, val, p);
148}
149
150template <typename Iterator, typename T, typename Predicate>
151inline Iterator findUpperBound_binary_current(Iterator first, Iterator last, Iterator current, const T& val, Predicate p) {
152 return current == last || p(val, *current) ?
153 findUpperBound_binary_end(first, current, val, p) :
154 findUpperBound_binary_begin(current, last, val, p);
155}
156
157template <typename Iterator, typename T>
158inline Iterator findUpperBound_binary_current(Iterator first, Iterator last, Iterator current, const T& val) {
159 return findUpperBound_binary_current(first, last, current, val, std::less<T>());
160}
161
162} // namespace JGadget
163
164#endif /* JGADGET_SEARCH_H */
int strcmp(const char *str1, const char *str2)
Definition string.c:118
static void * search(void *param_1, void *param_2)
Definition d_a_tag_qs.cpp:258
static u8 index[20][3]
Definition GXDraw.c:434
p
Definition e_acos.c:103
n
Definition e_fmod.c:115
int i
Definition e_log.c:92
unsigned long u32
Definition types.h:12
signed long s32
Definition types.h:11
Definition linklist.cpp:6
const T & toValueFromIndex(int idx, const T *pValue, u32 count, const T &fallback)
Definition search.h:43
Iterator findUpperBound_binary_begin(Iterator first, Iterator last, const T &val, Predicate p)
Definition search.h:84
Iterator findUpperBound_binary_end(Iterator first, Iterator last, const T &val, Predicate p)
Definition search.h:117
const char * toStringFromIndex(int index, const char *const *pValue, u32 count, const char *fallback)
Definition search.cpp:5
int toIndexFromString_linear(const char *, const char *const *, u32, int)
Definition search.cpp:9
Iterator findUpperBound_binary_current(Iterator first, Iterator last, Iterator current, const T &val, Predicate p)
Definition search.h:151
Iterator findUpperBound_binary_all(Iterator first, Iterator last, const T &val, Predicate p)
Definition search.h:79
int toIndexFromValue_linear_if(Predicate p, const T *pValue, u32 count, int fallback)
Definition search.h:54
Definition search.h:73
TIterator_reverse(Iterator it)
Definition search.h:75
TIterator_reverse()
Definition search.h:74
Definition search.h:69
static s32 get(s32 n)
Definition search.h:16
Definition search.h:12
const char * string_
Definition search.h:34
bool operator()(const char *sz) const
Definition search.h:24
TPR1IsEqual_string_(const char *sz)
Definition search.h:20