diff options
39 files changed, 246 insertions, 235 deletions
@@ -469,12 +469,13 @@ Memory efficiency - Added **cregex** with documentation - powerful regular expressions. - Updated **cstr**, now always takes self as pointer, like all containers except csview. - Updated **cvec**, **cdeq**, changed `*_range*` function names. -- `c_with`: macro renamed from `c_autovar`, which is deprecated. Like Python's **with** statement. -- `c_scope`: macro renamed from `c_autoscope`, which is deprecated. -- `c_defer`: macro renamed from `c_autodefer`, which is deprecated. Like Go's and Zig's **defer**. -- `c_forrange` with 3 to 5 args: swapped 1st <-> 2nd arg. -- New `c_forlist` macro to replace usages of `c_forarray`/`c_apply`, which is removed. - Added back **coption** - command line argument parsing. +- NEW / DEPRECATED: + - `c_forlist`: macro replacing `c_forarray` and `c_apply` which is deprecated. More user friendly. + - `c_forloop`: macro replacing `c_forrange` which is deprecated. Uses 'long long' as iterator type. + - `c_with`: macro renamed from `c_autovar`, which is deprecated. Like Python's **with** statement. + - `c_scope`: macro renamed from `c_autoscope`, which is deprecated. + - `c_defer`: macro renamed from `c_autodefer`, which is deprecated. Resembles Go's and Zig's **defer**. - [See detailed changes for version 3](#version-3). ## Changes version 3.8 diff --git a/benchmarks/external/ankerl/unordered_dense.h b/benchmarks/external/ankerl/unordered_dense.h index 220c65b8..3d7b256a 100644 --- a/benchmarks/external/ankerl/unordered_dense.h +++ b/benchmarks/external/ankerl/unordered_dense.h @@ -1,7 +1,7 @@ ///////////////////////// ankerl::unordered_dense::{map, set} ///////////////////////// // A fast & densely stored hashmap and hashset based on robin-hood backward shift deletion. -// Version 1.3.1 +// Version 1.3.3 // https://github.com/martinus/unordered_dense // // Licensed under the MIT License <http://opensource.org/licenses/MIT>. @@ -32,7 +32,7 @@ // see https://semver.org/spec/v2.0.0.html #define ANKERL_UNORDERED_DENSE_VERSION_MAJOR 1 // NOLINT(cppcoreguidelines-macro-usage) incompatible API changes #define ANKERL_UNORDERED_DENSE_VERSION_MINOR 3 // NOLINT(cppcoreguidelines-macro-usage) backwards compatible functionality -#define ANKERL_UNORDERED_DENSE_VERSION_PATCH 1 // NOLINT(cppcoreguidelines-macro-usage) backwards compatible bug fixes +#define ANKERL_UNORDERED_DENSE_VERSION_PATCH 3 // NOLINT(cppcoreguidelines-macro-usage) backwards compatible bug fixes // API versioning with inline namespace, see https://www.foonathan.net/2018/11/inline-namespaces/ #define ANKERL_UNORDERED_DENSE_VERSION_CONCAT1(major, minor, patch) v##major##_##minor##_##patch @@ -214,10 +214,9 @@ static inline void mum(uint64_t* a, uint64_t* b) { template <typename T, typename Enable = void> struct hash { - using is_avalanching = void; auto operator()(T const& obj) const noexcept(noexcept(std::declval<std::hash<T>>().operator()(std::declval<T const&>()))) -> uint64_t { - return detail::wyhash::hash(std::hash<T>{}(obj)); + return std::hash<T>{}(obj); } }; @@ -1189,12 +1188,12 @@ public: return do_find(key); } - auto contains(Key const& key) const -> size_t { + auto contains(Key const& key) const -> bool { return find(key) != end(); } template <class K, class H = Hash, class KE = KeyEqual, is_transparent<H, KE> = true> - auto contains(K const& key) const -> size_t { + auto contains(K const& key) const -> bool { return find(key) != end(); } diff --git a/benchmarks/misc/cbits_benchmark.cpp b/benchmarks/misc/cbits_benchmark.cpp index dd709db1..6dea2808 100644 --- a/benchmarks/misc/cbits_benchmark.cpp +++ b/benchmarks/misc/cbits_benchmark.cpp @@ -42,7 +42,7 @@ int main(int argc, char **argv) csrandom(seed); current_time = get_time_in_ms(); - c_forrange (40 * N) + c_forloop (40 * N) { uint64_t r = crandom(); bools[r & (N-1)] = r & 1<<29; @@ -51,7 +51,7 @@ int main(int argc, char **argv) difference1 = get_time_in_ms() - current_time; current_time = get_time_in_ms(); - c_forrange (100) c_forrange (num, N) + c_forloop (100) c_forloop (num, N) { total += bools[num]; } @@ -70,7 +70,7 @@ int main(int argc, char **argv) current_time = get_time_in_ms(); bitset<N> bits; - c_forrange (40 * N) + c_forloop (40 * N) { uint64_t r = crandom(); bits[r & (N-1)] = r & 1<<29; @@ -79,7 +79,7 @@ int main(int argc, char **argv) difference1 = get_time_in_ms() - current_time; current_time = get_time_in_ms(); - c_forrange (100) c_forrange (num, N) + c_forloop (100) c_forloop (num, N) { total += bits[num]; } @@ -96,7 +96,7 @@ int main(int argc, char **argv) current_time = get_time_in_ms(); cbits bits2 = cbits_with_size(N, false); - c_forrange (40 * N) + c_forloop (40 * N) { uint64_t r = crandom(); cbits_set_value(&bits2, r & (N-1), r & 1<<29); @@ -105,7 +105,7 @@ int main(int argc, char **argv) difference1 = get_time_in_ms() - current_time; current_time = get_time_in_ms(); - c_forrange (100) c_forrange (num, N) + c_forloop (100) c_forloop (num, N) { total += cbits_at(&bits2, num); } diff --git a/benchmarks/misc/rust_cmap.c b/benchmarks/misc/rust_cmap.c index afd384fc..e5d85b1c 100644 --- a/benchmarks/misc/rust_cmap.c +++ b/benchmarks/misc/rust_cmap.c @@ -33,7 +33,7 @@ int main() uint64_t rng[3] = {1872361123, 123879177, 87739234}, sum; clock_t now = clock(); - c_forrange (n) { + c_forloop (n) { uint64_t key = romu_trio(rng) & mask; cmap_u64_insert(&m, key, 0).ref->second += 1; } @@ -41,7 +41,7 @@ int main() now = clock(); sum = 0; - c_forrange (key, mask + 1) { sum += cmap_u64_contains(&m, key); } + c_forloop (key, mask + 1) { sum += cmap_u64_contains(&m, key); } printf("lookup : %" PRIuMAX "ms \tsum : %" PRIuMAX "\n", (clock() - now)/ms, sum); now = clock(); @@ -51,7 +51,7 @@ int main() uint64_t rng2[3] = {1872361123, 123879177, 87739234}; now = clock(); - c_forrange (n) { + c_forloop (n) { uint64_t key = romu_trio(rng2) & mask; cmap_u64_erase(&m, key); } diff --git a/benchmarks/picobench/picobench_cmap.cpp b/benchmarks/picobench/picobench_cmap.cpp index 7d114d30..afc3e3d1 100644 --- a/benchmarks/picobench/picobench_cmap.cpp +++ b/benchmarks/picobench/picobench_cmap.cpp @@ -54,14 +54,14 @@ static void ins_and_erase_i(picobench::state& s) csrandom(seed); picobench::scope scope(s); - c_forrange (s.iterations()) + c_forloop (s.iterations()) map[crandom()]; map.clear(); csrandom(seed); - c_forrange (s.iterations()) + c_forloop (s.iterations()) map[crandom()]; csrandom(seed); - c_forrange (s.iterations()) + c_forloop (s.iterations()) map.erase(crandom()); s.set_result(map.size()); } @@ -73,14 +73,14 @@ static void ins_and_erase_cmap_i(picobench::state& s) csrandom(seed); picobench::scope scope(s); - c_forrange (s.iterations()) + c_forloop (s.iterations()) cmap_i_insert(&map, crandom(), 0); cmap_i_clear(&map); csrandom(seed); - c_forrange (s.iterations()) + c_forloop (s.iterations()) cmap_i_insert(&map, crandom(), 0); csrandom(seed); - c_forrange (s.iterations()) + c_forloop (s.iterations()) cmap_i_erase(&map, crandom()); s.set_result(cmap_i_size(&map)); cmap_i_drop(&map); @@ -93,14 +93,14 @@ static void ins_and_erase_cmap_x(picobench::state& s) csrandom(seed); picobench::scope scope(s); - c_forrange (s.iterations()) + c_forloop (s.iterations()) cmap_x_insert(&map, crandom(), 0); cmap_x_clear(&map); csrandom(seed); - c_forrange (s.iterations()) + c_forloop (s.iterations()) cmap_x_insert(&map, crandom(), 0); csrandom(seed); - c_forrange (s.iterations()) + c_forloop (s.iterations()) cmap_x_erase(&map, crandom()); s.set_result(cmap_x_size(&map)); cmap_x_drop(&map); @@ -126,7 +126,7 @@ static void ins_and_access_i(picobench::state& s) csrandom(seed); picobench::scope scope(s); - c_forrange (N1) + c_forloop (N1) result += ++map[crandom() & mask]; s.set_result(result); } @@ -140,7 +140,7 @@ static void ins_and_access_cmap_i(picobench::state& s) csrandom(seed); picobench::scope scope(s); - c_forrange (N1) + c_forloop (N1) result += ++cmap_i_insert(&map, crandom() & mask, 0).ref->second; s.set_result(result); cmap_i_drop(&map); @@ -174,7 +174,7 @@ static void ins_and_access_s(picobench::state& s) csrandom(seed); picobench::scope scope(s); - c_forrange (s.iterations()) { + c_forloop (s.iterations()) { randomize(&str[0], str.size()); map.emplace(str, str); randomize(&str[0], str.size()); @@ -193,7 +193,7 @@ static void ins_and_access_cmap_s(picobench::state& s) csrandom(seed); picobench::scope scope(s); - c_forrange (s.iterations()) { + c_forloop (s.iterations()) { randomize(buf, s.arg()); //if (s.arg() > 30) { printf("%s\n", buf); exit(0); } cmap_str_emplace(&map, buf, buf); @@ -228,7 +228,7 @@ static void iterate_x(picobench::state& s) size_t result = 0; // measure insert then iterate whole map - c_forrange (n, s.iterations()) { + c_forloop (n, s.iterations()) { map[crandom()] = n; if (!(n & K)) for (auto const& keyVal : map) result += keyVal.second; @@ -238,7 +238,7 @@ static void iterate_x(picobench::state& s) csrandom(seed); // measure erase then iterate whole map - c_forrange (n, s.iterations()) { + c_forloop (n, s.iterations()) { map.erase(crandom()); if (!(n & K)) for (auto const& keyVal : map) result += keyVal.second; @@ -257,7 +257,7 @@ static void iterate_cmap_x(picobench::state& s) size_t result = 0; // measure insert then iterate whole map - c_forrange (n, s.iterations()) { + c_forloop (n, s.iterations()) { cmap_x_insert_or_assign(&map, crandom(), n); if (!(n & K)) c_foreach (i, cmap_x, map) result += i.ref->second; @@ -267,7 +267,7 @@ static void iterate_cmap_x(picobench::state& s) csrandom(seed); // measure erase then iterate whole map - c_forrange (n, s.iterations()) { + c_forloop (n, s.iterations()) { cmap_x_erase(&map, crandom()); if (!(n & K)) c_foreach (i, cmap_x, map) result += i.ref->second; diff --git a/benchmarks/picobench/picobench_csmap.cpp b/benchmarks/picobench/picobench_csmap.cpp index 5caab6cc..1007cfbb 100644 --- a/benchmarks/picobench/picobench_csmap.cpp +++ b/benchmarks/picobench/picobench_csmap.cpp @@ -38,7 +38,7 @@ static void ctor_and_ins_one_i(picobench::state& s) { size_t result = 0; picobench::scope scope(s); - c_forrange (n, s.iterations()) { + c_forloop (n, s.iterations()) { MapInt map; map[n]; result += map.size(); @@ -50,7 +50,7 @@ static void ctor_and_ins_one_csmap_i(picobench::state& s) { size_t result = 0; picobench::scope scope(s); - c_forrange (n, s.iterations()) { + c_forloop (n, s.iterations()) { csmap_i map = csmap_i_init(); csmap_i_insert(&map, n, 0); result += csmap_i_size(&map); @@ -73,7 +73,7 @@ static void insert_i(picobench::state& s) MapInt map; csrandom(seed); picobench::scope scope(s); - c_forrange (n, s.iterations()) + c_forloop (n, s.iterations()) map.emplace(crandom() & 0xfffffff, n); s.set_result(map.size()); } @@ -83,7 +83,7 @@ static void insert_csmap_i(picobench::state& s) csmap_i map = csmap_i_init(); csrandom(seed); picobench::scope scope(s); - c_forrange (n, s.iterations()) + c_forloop (n, s.iterations()) csmap_i_insert(&map, crandom() & 0xfffffff, n); s.set_result(csmap_i_size(&map)); csmap_i_drop(&map); @@ -106,17 +106,17 @@ static void ins_and_erase_i(picobench::state& s) csrandom(seed); picobench::scope scope(s); - c_forrange (i, s.iterations()) + c_forloop (i, s.iterations()) map.emplace(crandom() & mask, i); result = map.size(); map.clear(); csrandom(seed); - c_forrange (i, s.iterations()) + c_forloop (i, s.iterations()) map[crandom() & mask] = i; csrandom(seed); - c_forrange (s.iterations()) + c_forloop (s.iterations()) map.erase(crandom() & mask); s.set_result(result); } @@ -129,17 +129,17 @@ static void ins_and_erase_csmap_i(picobench::state& s) csrandom(seed); picobench::scope scope(s); - c_forrange (i, s.iterations()) + c_forloop (i, s.iterations()) csmap_i_insert(&map, crandom() & mask, i); result = csmap_i_size(&map); csmap_i_clear(&map); csrandom(seed); - c_forrange (i, s.iterations()) + c_forloop (i, s.iterations()) csmap_i_insert_or_assign(&map, crandom() & mask, i); csrandom(seed); - c_forrange (s.iterations()) + c_forloop (s.iterations()) csmap_i_erase(&map, crandom() & mask); s.set_result(result); csmap_i_drop(&map); @@ -161,7 +161,7 @@ static void ins_and_access_i(picobench::state& s) csrandom(seed); picobench::scope scope(s); - c_forrange (s.iterations()) { + c_forloop (s.iterations()) { result += ++map[crandom() & mask]; auto it = map.find(crandom() & mask); if (it != map.end()) map.erase(it->first); @@ -177,7 +177,7 @@ static void ins_and_access_csmap_i(picobench::state& s) csrandom(seed); picobench::scope scope(s); - c_forrange (s.iterations()) { + c_forloop (s.iterations()) { result += ++csmap_i_insert(&map, crandom() & mask, 0).ref->second; const csmap_i_value* val = csmap_i_get(&map, crandom() & mask); if (val) csmap_i_erase(&map, val->first); @@ -208,12 +208,12 @@ static void ins_and_access_s(picobench::state& s) picobench::scope scope(s); csrandom(seed); - c_forrange (s.iterations()) { + c_forloop (s.iterations()) { randomize(&str[0], str.size()); map.emplace(str, str); } csrandom(seed); - c_forrange (s.iterations()) { + c_forloop (s.iterations()) { randomize(&str[0], str.size()); result += map.erase(str); } @@ -229,12 +229,12 @@ static void ins_and_access_csmap_s(picobench::state& s) picobench::scope scope(s); csrandom(seed); - c_forrange (s.iterations()) { + c_forloop (s.iterations()) { randomize(buf, s.arg()); csmap_str_emplace(&map, buf, buf); } csrandom(seed); - c_forrange (s.iterations()) { + c_forloop (s.iterations()) { randomize(buf, s.arg()); result += csmap_str_erase(&map, buf); /*csmap_str_iter it = csmap_str_find(&map, buf); @@ -266,7 +266,7 @@ static void iterate_x(picobench::state& s) size_t result = 0; // measure insert then iterate whole map - c_forrange (n, s.iterations()) { + c_forloop (n, s.iterations()) { map[crandom()] = n; if (!(n & K)) for (auto const& keyVal : map) result += keyVal.second; @@ -276,7 +276,7 @@ static void iterate_x(picobench::state& s) csrandom(seed); // measure erase then iterate whole map - c_forrange (n, s.iterations()) { + c_forloop (n, s.iterations()) { map.erase(crandom()); if (!(n & K)) for (auto const& keyVal : map) result += keyVal.second; @@ -294,7 +294,7 @@ static void iterate_csmap_x(picobench::state& s) size_t result = 0; // measure insert then iterate whole map - c_forrange (n, s.iterations()) { + c_forloop (n, s.iterations()) { csmap_x_insert_or_assign(&map, crandom(), n); if (!(n & K)) c_foreach (i, csmap_x, map) result += i.ref->second; @@ -304,7 +304,7 @@ static void iterate_csmap_x(picobench::state& s) csrandom(seed); // measure erase then iterate whole map - c_forrange (n, s.iterations()) { + c_forloop (n, s.iterations()) { csmap_x_erase(&map, crandom()); if (!(n & K)) c_foreach (i, csmap_x, map) result += i.ref->second; diff --git a/benchmarks/plotbench/cdeq_benchmark.cpp b/benchmarks/plotbench/cdeq_benchmark.cpp index 49db3914..de85114f 100644 --- a/benchmarks/plotbench/cdeq_benchmark.cpp +++ b/benchmarks/plotbench/cdeq_benchmark.cpp @@ -29,29 +29,29 @@ Sample test_std_deque() { s.test[INSERT].t1 = clock(); container con; csrandom(seed); - c_forrange (N/3) con.push_front(crandom() & mask1); - c_forrange (N/3) {con.push_back(crandom() & mask1); con.pop_front();} - c_forrange (N/3) con.push_back(crandom() & mask1); + c_forloop (N/3) con.push_front(crandom() & mask1); + c_forloop (N/3) {con.push_back(crandom() & mask1); con.pop_front();} + c_forloop (N/3) con.push_back(crandom() & mask1); s.test[INSERT].t2 = clock(); s.test[INSERT].sum = con.size(); s.test[ERASE].t1 = clock(); - c_forrange (con.size()/2) { con.pop_front(); con.pop_back(); } + c_forloop (con.size()/2) { con.pop_front(); con.pop_back(); } s.test[ERASE].t2 = clock(); s.test[ERASE].sum = con.size(); }{ container con; csrandom(seed); - c_forrange (N) con.push_back(crandom() & mask2); + c_forloop (N) con.push_back(crandom() & mask2); s.test[FIND].t1 = clock(); size_t sum = 0; // Iteration - not inherent find - skipping //container::iterator it; - //c_forrange (S) if ((it = std::find(con.begin(), con.end(), crandom() & mask2)) != con.end()) sum += *it; + //c_forloop (S) if ((it = std::find(con.begin(), con.end(), crandom() & mask2)) != con.end()) sum += *it; s.test[FIND].t2 = clock(); s.test[FIND].sum = sum; s.test[ITER].t1 = clock(); sum = 0; - c_forrange (R) c_forrange (i, N) sum += con[i]; + c_forloop (R) c_forloop (i, N) sum += con[i]; s.test[ITER].t2 = clock(); s.test[ITER].sum = sum; s.test[DESTRUCT].t1 = clock(); @@ -73,29 +73,29 @@ Sample test_stc_deque() { container con = cdeq_x_init(); //cdeq_x_reserve(&con, N); csrandom(seed); - c_forrange (N/3) cdeq_x_push_front(&con, crandom() & mask1); - c_forrange (N/3) {cdeq_x_push_back(&con, crandom() & mask1); cdeq_x_pop_front(&con);} - c_forrange (N/3) cdeq_x_push_back(&con, crandom() & mask1); + c_forloop (N/3) cdeq_x_push_front(&con, crandom() & mask1); + c_forloop (N/3) {cdeq_x_push_back(&con, crandom() & mask1); cdeq_x_pop_front(&con);} + c_forloop (N/3) cdeq_x_push_back(&con, crandom() & mask1); s.test[INSERT].t2 = clock(); s.test[INSERT].sum = cdeq_x_size(&con); s.test[ERASE].t1 = clock(); - c_forrange (cdeq_x_size(&con)/2) { cdeq_x_pop_front(&con); cdeq_x_pop_back(&con); } + c_forloop (cdeq_x_size(&con)/2) { cdeq_x_pop_front(&con); cdeq_x_pop_back(&con); } s.test[ERASE].t2 = clock(); s.test[ERASE].sum = cdeq_x_size(&con); cdeq_x_drop(&con); }{ csrandom(seed); container con = cdeq_x_init(); - c_forrange (N) cdeq_x_push_back(&con, crandom() & mask2); + c_forloop (N) cdeq_x_push_back(&con, crandom() & mask2); s.test[FIND].t1 = clock(); size_t sum = 0; //cdeq_x_iter it, end = cdeq_x_end(&con); - //c_forrange (S) if ((it = cdeq_x_find(&con, crandom() & mask2)).ref != end.ref) sum += *it.ref; + //c_forloop (S) if ((it = cdeq_x_find(&con, crandom() & mask2)).ref != end.ref) sum += *it.ref; s.test[FIND].t2 = clock(); s.test[FIND].sum = sum; s.test[ITER].t1 = clock(); sum = 0; - c_forrange (R) c_forrange (i, N) sum += con.data[i]; + c_forloop (R) c_forloop (i, N) sum += con.data[i]; s.test[ITER].t2 = clock(); s.test[ITER].sum = sum; s.test[DESTRUCT].t1 = clock(); @@ -109,30 +109,30 @@ Sample test_stc_deque() { int main(int argc, char* argv[]) { Sample std_s[SAMPLES + 1], stc_s[SAMPLES + 1]; - c_forrange (i, int, SAMPLES) { + c_forloop (i, SAMPLES) { std_s[i] = test_std_deque(); stc_s[i] = test_stc_deque(); - if (i > 0) c_forrange (j, int, N_TESTS) { + if (i > 0) c_forloop (j, N_TESTS) { if (secs(std_s[i].test[j]) < secs(std_s[0].test[j])) std_s[0].test[j] = std_s[i].test[j]; if (secs(stc_s[i].test[j]) < secs(stc_s[0].test[j])) stc_s[0].test[j] = stc_s[i].test[j]; - if (stc_s[i].test[j].sum != stc_s[0].test[j].sum) printf("Error in sum: test %d, sample %d\n", i, j); + if (stc_s[i].test[j].sum != stc_s[0].test[j].sum) printf("Error in sum: test %lld, sample %lld\n", i, j); } } const char* comp = argc > 1 ? argv[1] : "test"; bool header = (argc > 2 && argv[2][0] == '1'); float std_sum = 0, stc_sum = 0; - c_forrange (j, N_TESTS) { + c_forloop (j, N_TESTS) { std_sum += secs(std_s[0].test[j]); stc_sum += secs(stc_s[0].test[j]); } if (header) printf("Compiler,Library,C,Method,Seconds,Ratio\n"); - c_forrange (j, N_TESTS) + c_forloop (j, N_TESTS) printf("%s,%s n:%d,%s,%.3f,%.3f\n", comp, std_s[0].name, N, operations[j], secs(std_s[0].test[j]), 1.0f); printf("%s,%s n:%d,%s,%.3f,%.3f\n", comp, std_s[0].name, N, "total", std_sum, 1.0f); - c_forrange (j, N_TESTS) + c_forloop (j, N_TESTS) printf("%s,%s n:%d,%s,%.3f,%.3f\n", comp, stc_s[0].name, N, operations[j], secs(stc_s[0].test[j]), secs(std_s[0].test[j]) ? secs(stc_s[0].test[j])/secs(std_s[0].test[j]) : 1.0f); printf("%s,%s n:%d,%s,%.3f,%.3f\n", comp, stc_s[0].name, N, "total", stc_sum, stc_sum/std_sum); } diff --git a/benchmarks/plotbench/clist_benchmark.cpp b/benchmarks/plotbench/clist_benchmark.cpp index ddd1e2f0..c18ee78e 100644 --- a/benchmarks/plotbench/clist_benchmark.cpp +++ b/benchmarks/plotbench/clist_benchmark.cpp @@ -29,28 +29,28 @@ Sample test_std_forward_list() { s.test[INSERT].t1 = clock(); container con; csrandom(seed); - c_forrange (N/2) con.push_front(crandom() & mask1); - c_forrange (N/2) con.push_front(crandom() & mask1); + c_forloop (N/2) con.push_front(crandom() & mask1); + c_forloop (N/2) con.push_front(crandom() & mask1); s.test[INSERT].t2 = clock(); s.test[INSERT].sum = 0; s.test[ERASE].t1 = clock(); - c_forrange (N) con.pop_front(); + c_forloop (N) con.pop_front(); s.test[ERASE].t2 = clock(); s.test[ERASE].sum = 0; }{ container con; csrandom(seed); - c_forrange (N) con.push_front(crandom() & mask2); + c_forloop (N) con.push_front(crandom() & mask2); s.test[FIND].t1 = clock(); size_t sum = 0; container::iterator it; // Iteration - not inherent find - skipping - //c_forrange (S) if ((it = std::find(con.begin(), con.end(), crandom() & mask2)) != con.end()) sum += *it; + //c_forloop (S) if ((it = std::find(con.begin(), con.end(), crandom() & mask2)) != con.end()) sum += *it; s.test[FIND].t2 = clock(); s.test[FIND].sum = sum; s.test[ITER].t1 = clock(); sum = 0; - c_forrange (R) for (auto i: con) sum += i; + c_forloop (R) for (auto i: con) sum += i; s.test[ITER].t2 = clock(); s.test[ITER].sum = sum; s.test[DESTRUCT].t1 = clock(); @@ -71,28 +71,28 @@ Sample test_stc_forward_list() { s.test[INSERT].t1 = clock(); container con = clist_x_init(); csrandom(seed); - c_forrange (N/2) clist_x_push_front(&con, crandom() & mask1); - c_forrange (N/2) clist_x_push_back(&con, crandom() & mask1); + c_forloop (N/2) clist_x_push_front(&con, crandom() & mask1); + c_forloop (N/2) clist_x_push_back(&con, crandom() & mask1); s.test[INSERT].t2 = clock(); s.test[INSERT].sum = 0; s.test[ERASE].t1 = clock(); - c_forrange (N) clist_x_pop_front(&con); + c_forloop (N) clist_x_pop_front(&con); s.test[ERASE].t2 = clock(); s.test[ERASE].sum = 0; clist_x_drop(&con); }{ csrandom(seed); container con = clist_x_init(); - c_forrange (N) clist_x_push_front(&con, crandom() & mask2); + c_forloop (N) clist_x_push_front(&con, crandom() & mask2); s.test[FIND].t1 = clock(); size_t sum = 0; //clist_x_iter it, end = clist_x_end(&con); - //c_forrange (S) if ((it = clist_x_find(&con, crandom() & mask2)).ref != end.ref) sum += *it.ref; + //c_forloop (S) if ((it = clist_x_find(&con, crandom() & mask2)).ref != end.ref) sum += *it.ref; s.test[FIND].t2 = clock(); s.test[FIND].sum = sum; s.test[ITER].t1 = clock(); sum = 0; - c_forrange (R) c_foreach (i, clist_x, con) sum += *i.ref; + c_forloop (R) c_foreach (i, clist_x, con) sum += *i.ref; s.test[ITER].t2 = clock(); s.test[ITER].sum = sum; s.test[DESTRUCT].t1 = clock(); @@ -106,30 +106,30 @@ Sample test_stc_forward_list() { int main(int argc, char* argv[]) { Sample std_s[SAMPLES + 1], stc_s[SAMPLES + 1]; - c_forrange (i, int, SAMPLES) { + c_forloop (i, SAMPLES) { std_s[i] = test_std_forward_list(); stc_s[i] = test_stc_forward_list(); - if (i > 0) c_forrange (j, int, N_TESTS) { + if (i > 0) c_forloop (j, N_TESTS) { if (secs(std_s[i].test[j]) < secs(std_s[0].test[j])) std_s[0].test[j] = std_s[i].test[j]; if (secs(stc_s[i].test[j]) < secs(stc_s[0].test[j])) stc_s[0].test[j] = stc_s[i].test[j]; - if (stc_s[i].test[j].sum != stc_s[0].test[j].sum) printf("Error in sum: test %d, sample %d\n", i, j); + if (stc_s[i].test[j].sum != stc_s[0].test[j].sum) printf("Error in sum: test %lld, sample %lld\n", i, j); } } const char* comp = argc > 1 ? argv[1] : "test"; bool header = (argc > 2 && argv[2][0] == '1'); float std_sum = 0, stc_sum = 0; - c_forrange (j, N_TESTS) { + c_forloop (j, N_TESTS) { std_sum += secs(std_s[0].test[j]); stc_sum += secs(stc_s[0].test[j]); } if (header) printf("Compiler,Library,C,Method,Seconds,Ratio\n"); - c_forrange (j, N_TESTS) + c_forloop (j, N_TESTS) printf("%s,%s n:%d,%s,%.3f,%.3f\n", comp, std_s[0].name, N, operations[j], secs(std_s[0].test[j]), 1.0f); printf("%s,%s n:%d,%s,%.3f,%.3f\n", comp, std_s[0].name, N, "total", std_sum, 1.0f); - c_forrange (j, N_TESTS) + c_forloop (j, N_TESTS) printf("%s,%s n:%d,%s,%.3f,%.3f\n", comp, stc_s[0].name, N, operations[j], secs(stc_s[0].test[j]), secs(std_s[0].test[j]) ? secs(stc_s[0].test[j])/secs(std_s[0].test[j]) : 1.0f); printf("%s,%s n:%d,%s,%.3f,%.3f\n", comp, stc_s[0].name, N, "total", stc_sum, stc_sum/std_sum); }
\ No newline at end of file diff --git a/benchmarks/plotbench/cmap_benchmark.cpp b/benchmarks/plotbench/cmap_benchmark.cpp index cf20c927..cca90461 100644 --- a/benchmarks/plotbench/cmap_benchmark.cpp +++ b/benchmarks/plotbench/cmap_benchmark.cpp @@ -29,30 +29,30 @@ Sample test_std_unordered_map() { csrandom(seed); s.test[INSERT].t1 = clock(); container con; - c_forrange (i, N/2) con.emplace(crandom() & mask1, i); - c_forrange (i, N/2) con.emplace(i, i); + c_forloop (i, N/2) con.emplace(crandom() & mask1, i); + c_forloop (i, N/2) con.emplace(i, i); s.test[INSERT].t2 = clock(); s.test[INSERT].sum = con.size(); csrandom(seed); s.test[ERASE].t1 = clock(); - c_forrange (N) con.erase(crandom() & mask1); + c_forloop (N) con.erase(crandom() & mask1); s.test[ERASE].t2 = clock(); s.test[ERASE].sum = con.size(); }{ container con; csrandom(seed); - c_forrange (i, N/2) con.emplace(crandom() & mask1, i); - c_forrange (i, N/2) con.emplace(i, i); + c_forloop (i, N/2) con.emplace(crandom() & mask1, i); + c_forloop (i, N/2) con.emplace(i, i); csrandom(seed); s.test[FIND].t1 = clock(); size_t sum = 0; container::iterator it; - c_forrange (N) if ((it = con.find(crandom() & mask1)) != con.end()) sum += it->second; + c_forloop (N) if ((it = con.find(crandom() & mask1)) != con.end()) sum += it->second; s.test[FIND].t2 = clock(); s.test[FIND].sum = sum; s.test[ITER].t1 = clock(); sum = 0; - c_forrange (R) for (auto i: con) sum += i.second; + c_forloop (R) for (auto i: con) sum += i.second; s.test[ITER].t2 = clock(); s.test[ITER].sum = sum; s.test[DESTRUCT].t1 = clock(); @@ -73,33 +73,33 @@ Sample test_stc_unordered_map() { csrandom(seed); s.test[INSERT].t1 = clock(); container con = cmap_x_init(); - c_forrange (i, N/2) cmap_x_insert(&con, crandom() & mask1, i); - c_forrange (i, N/2) cmap_x_insert(&con, i, i); + c_forloop (i, N/2) cmap_x_insert(&con, crandom() & mask1, i); + c_forloop (i, N/2) cmap_x_insert(&con, i, i); s.test[INSERT].t2 = clock(); s.test[INSERT].sum = cmap_x_size(&con); csrandom(seed); s.test[ERASE].t1 = clock(); - c_forrange (N) cmap_x_erase(&con, crandom() & mask1); + c_forloop (N) cmap_x_erase(&con, crandom() & mask1); s.test[ERASE].t2 = clock(); s.test[ERASE].sum = cmap_x_size(&con); cmap_x_drop(&con); }{ container con = cmap_x_init(); csrandom(seed); - c_forrange (i, N/2) cmap_x_insert(&con, crandom() & mask1, i); - c_forrange (i, N/2) cmap_x_insert(&con, i, i); + c_forloop (i, N/2) cmap_x_insert(&con, crandom() & mask1, i); + c_forloop (i, N/2) cmap_x_insert(&con, i, i); csrandom(seed); s.test[FIND].t1 = clock(); size_t sum = 0; const cmap_x_value* val; - c_forrange (N) + c_forloop (N) if ((val = cmap_x_get(&con, crandom() & mask1))) sum += val->second; s.test[FIND].t2 = clock(); s.test[FIND].sum = sum; s.test[ITER].t1 = clock(); sum = 0; - c_forrange (R) c_foreach (i, cmap_x, con) sum += i.ref->second; + c_forloop (R) c_foreach (i, cmap_x, con) sum += i.ref->second; s.test[ITER].t2 = clock(); s.test[ITER].sum = sum; s.test[DESTRUCT].t1 = clock(); @@ -113,30 +113,30 @@ Sample test_stc_unordered_map() { int main(int argc, char* argv[]) { Sample std_s[SAMPLES + 1], stc_s[SAMPLES + 1]; - c_forrange (i, int, SAMPLES) { + c_forloop (i, SAMPLES) { std_s[i] = test_std_unordered_map(); stc_s[i] = test_stc_unordered_map(); - if (i > 0) c_forrange (j, int, N_TESTS) { + if (i > 0) c_forloop (j, N_TESTS) { if (secs(std_s[i].test[j]) < secs(std_s[0].test[j])) std_s[0].test[j] = std_s[i].test[j]; if (secs(stc_s[i].test[j]) < secs(stc_s[0].test[j])) stc_s[0].test[j] = stc_s[i].test[j]; - if (stc_s[i].test[j].sum != stc_s[0].test[j].sum) printf("Error in sum: test %d, sample %d\n", i, j); + if (stc_s[i].test[j].sum != stc_s[0].test[j].sum) printf("Error in sum: test %lld, sample %lld\n", i, j); } } const char* comp = argc > 1 ? argv[1] : "test"; bool header = (argc > 2 && argv[2][0] == '1'); float std_sum = 0, stc_sum = 0; - c_forrange (j, N_TESTS) { + c_forloop (j, N_TESTS) { std_sum += secs(std_s[0].test[j]); stc_sum += secs(stc_s[0].test[j]); } if (header) printf("Compiler,Library,C,Method,Seconds,Ratio\n"); - c_forrange (j, N_TESTS) + c_forloop (j, N_TESTS) printf("%s,%s n:%d,%s,%.3f,%.3f\n", comp, std_s[0].name, N, operations[j], secs(std_s[0].test[j]), 1.0f); printf("%s,%s n:%d,%s,%.3f,%.3f\n", comp, std_s[0].name, N, "total", std_sum, 1.0f); - c_forrange (j, N_TESTS) + c_forloop (j, N_TESTS) printf("%s,%s n:%d,%s,%.3f,%.3f\n", comp, stc_s[0].name, N, operations[j], secs(stc_s[0].test[j]), secs(std_s[0].test[j]) ? secs(stc_s[0].test[j])/secs(std_s[0].test[j]) : 1.0f); printf("%s,%s n:%d,%s,%.3f,%.3f\n", comp, stc_s[0].name, N, "total", stc_sum, stc_sum/std_sum); }
\ No newline at end of file diff --git a/benchmarks/plotbench/cpque_benchmark.cpp b/benchmarks/plotbench/cpque_benchmark.cpp index ca28082b..1290e3b3 100644 --- a/benchmarks/plotbench/cpque_benchmark.cpp +++ b/benchmarks/plotbench/cpque_benchmark.cpp @@ -20,14 +20,14 @@ void std_test() std::priority_queue<float, std::vector<float>, std::greater<float>> pq; rng = stc64_new(seed); clock_t start = clock(); - c_forrange (i, N) + c_forloop (i, N) pq.push((float) stc64_randf(&rng)*100000); printf("Built priority queue: %f secs\n", (clock() - start) / (float) CLOCKS_PER_SEC); printf("%g ", pq.top()); start = clock(); - c_forrange (i, N) { + c_forloop (i, N) { pq.pop(); } @@ -44,18 +44,18 @@ void stc_test() { rng = stc64_new(seed); clock_t start = clock(); - c_forrange (i, N) + c_forloop (i, N) cpque_f_push(&pq, (float) stc64_randf(&rng)*100000); printf("Built priority queue: %f secs\n", (clock() - start) / (float) CLOCKS_PER_SEC); printf("%g ", *cpque_f_top(&pq)); - c_forrange (i, int, M) { + c_forloop (i, M) { cpque_f_pop(&pq); } start = clock(); - c_forrange (i, int, M, N) + c_forloop (i, M, N) cpque_f_pop(&pq); printf("\npopped PQ: %f secs\n", (clock() - start) / (float) CLOCKS_PER_SEC); } diff --git a/benchmarks/plotbench/csmap_benchmark.cpp b/benchmarks/plotbench/csmap_benchmark.cpp index 7e6d62c6..e8243285 100644 --- a/benchmarks/plotbench/csmap_benchmark.cpp +++ b/benchmarks/plotbench/csmap_benchmark.cpp @@ -29,30 +29,30 @@ Sample test_std_map() { csrandom(seed); s.test[INSERT].t1 = clock(); container con; - c_forrange (i, N/2) con.emplace(crandom() & mask1, i); - c_forrange (i, N/2) con.emplace(i, i); + c_forloop (i, N/2) con.emplace(crandom() & mask1, i); + c_forloop (i, N/2) con.emplace(i, i); s.test[INSERT].t2 = clock(); s.test[INSERT].sum = con.size(); csrandom(seed); s.test[ERASE].t1 = clock(); - c_forrange (N) con.erase(crandom() & mask1); + c_forloop (N) con.erase(crandom() & mask1); s.test[ERASE].t2 = clock(); s.test[ERASE].sum = con.size(); }{ container con; csrandom(seed); - c_forrange (i, N/2) con.emplace(crandom() & mask1, i); - c_forrange (i, N/2) con.emplace(i, i); + c_forloop (i, N/2) con.emplace(crandom() & mask1, i); + c_forloop (i, N/2) con.emplace(i, i); csrandom(seed); s.test[FIND].t1 = clock(); size_t sum = 0; container::iterator it; - c_forrange (N) if ((it = con.find(crandom() & mask1)) != con.end()) sum += it->second; + c_forloop (N) if ((it = con.find(crandom() & mask1)) != con.end()) sum += it->second; s.test[FIND].t2 = clock(); s.test[FIND].sum = sum; s.test[ITER].t1 = clock(); sum = 0; - c_forrange (R) for (auto i: con) sum += i.second; + c_forloop (R) for (auto i: con) sum += i.second; s.test[ITER].t2 = clock(); s.test[ITER].sum = sum; s.test[DESTRUCT].t1 = clock(); @@ -74,33 +74,33 @@ Sample test_stc_map() { csrandom(seed); s.test[INSERT].t1 = clock(); container con = csmap_x_init(); - c_forrange (i, N/2) csmap_x_insert(&con, crandom() & mask1, i); - c_forrange (i, N/2) csmap_x_insert(&con, i, i); + c_forloop (i, N/2) csmap_x_insert(&con, crandom() & mask1, i); + c_forloop (i, N/2) csmap_x_insert(&con, i, i); s.test[INSERT].t2 = clock(); s.test[INSERT].sum = csmap_x_size(&con); csrandom(seed); s.test[ERASE].t1 = clock(); - c_forrange (N) csmap_x_erase(&con, crandom() & mask1); + c_forloop (N) csmap_x_erase(&con, crandom() & mask1); s.test[ERASE].t2 = clock(); s.test[ERASE].sum = csmap_x_size(&con); csmap_x_drop(&con); }{ container con = csmap_x_init(); csrandom(seed); - c_forrange (i, N/2) csmap_x_insert(&con, crandom() & mask1, i); - c_forrange (i, N/2) csmap_x_insert(&con, i, i); + c_forloop (i, N/2) csmap_x_insert(&con, crandom() & mask1, i); + c_forloop (i, N/2) csmap_x_insert(&con, i, i); csrandom(seed); s.test[FIND].t1 = clock(); size_t sum = 0; const csmap_x_value* val; - c_forrange (N) + c_forloop (N) if ((val = csmap_x_get(&con, crandom() & mask1))) sum += val->second; s.test[FIND].t2 = clock(); s.test[FIND].sum = sum; s.test[ITER].t1 = clock(); sum = 0; - c_forrange (R) c_foreach (i, csmap_x, con) sum += i.ref->second; + c_forloop (R) c_foreach (i, csmap_x, con) sum += i.ref->second; s.test[ITER].t2 = clock(); s.test[ITER].sum = sum; s.test[DESTRUCT].t1 = clock(); @@ -114,30 +114,30 @@ Sample test_stc_map() { int main(int argc, char* argv[]) { Sample std_s[SAMPLES + 1], stc_s[SAMPLES + 1]; - c_forrange (i, int, SAMPLES) { + c_forloop (i, SAMPLES) { std_s[i] = test_std_map(); stc_s[i] = test_stc_map(); - if (i > 0) c_forrange (j, int, N_TESTS) { + if (i > 0) c_forloop (j, N_TESTS) { if (secs(std_s[i].test[j]) < secs(std_s[0].test[j])) std_s[0].test[j] = std_s[i].test[j]; if (secs(stc_s[i].test[j]) < secs(stc_s[0].test[j])) stc_s[0].test[j] = stc_s[i].test[j]; - if (stc_s[i].test[j].sum != stc_s[0].test[j].sum) printf("Error in sum: test %d, sample %d\n", i, j); + if (stc_s[i].test[j].sum != stc_s[0].test[j].sum) printf("Error in sum: test %lld, sample %lld\n", i, j); } } const char* comp = argc > 1 ? argv[1] : "test"; bool header = (argc > 2 && argv[2][0] == '1'); float std_sum = 0, stc_sum = 0; - c_forrange (j, N_TESTS) { + c_forloop (j, N_TESTS) { std_sum += secs(std_s[0].test[j]); stc_sum += secs(stc_s[0].test[j]); } if (header) printf("Compiler,Library,C,Method,Seconds,Ratio\n"); - c_forrange (j, N_TESTS) + c_forloop (j, N_TESTS) printf("%s,%s n:%d,%s,%.3f,%.3f\n", comp, std_s[0].name, N, operations[j], secs(std_s[0].test[j]), 1.0f); printf("%s,%s n:%d,%s,%.3f,%.3f\n", comp, std_s[0].name, N, "total", std_sum, 1.0f); - c_forrange (j, N_TESTS) + c_forloop (j, N_TESTS) printf("%s,%s n:%d,%s,%.3f,%.3f\n", comp, stc_s[0].name, N, operations[j], secs(stc_s[0].test[j]), secs(std_s[0].test[j]) ? secs(stc_s[0].test[j])/secs(std_s[0].test[j]) : 1.0f); printf("%s,%s n:%d,%s,%.3f,%.3f\n", comp, stc_s[0].name, N, "total", stc_sum, stc_sum/std_sum); } diff --git a/benchmarks/plotbench/cvec_benchmark.cpp b/benchmarks/plotbench/cvec_benchmark.cpp index a0faf679..347a6319 100644 --- a/benchmarks/plotbench/cvec_benchmark.cpp +++ b/benchmarks/plotbench/cvec_benchmark.cpp @@ -29,27 +29,27 @@ Sample test_std_vector() { s.test[INSERT].t1 = clock(); container con; csrandom(seed); - c_forrange (N) con.push_back(crandom() & mask1); + c_forloop (N) con.push_back(crandom() & mask1); s.test[INSERT].t2 = clock(); s.test[INSERT].sum = con.size(); s.test[ERASE].t1 = clock(); - c_forrange (N) con.pop_back(); + c_forloop (N) con.pop_back(); s.test[ERASE].t2 = clock(); s.test[ERASE].sum = con.size(); }{ container con; csrandom(seed); - c_forrange (N) con.push_back(crandom() & mask2); + c_forloop (N) con.push_back(crandom() & mask2); s.test[FIND].t1 = clock(); size_t sum = 0; //container::iterator it; // Iteration - not inherent find - skipping - //c_forrange (S) if ((it = std::find(con.begin(), con.end(), crandom() & mask2)) != con.end()) sum += *it; + //c_forloop (S) if ((it = std::find(con.begin(), con.end(), crandom() & mask2)) != con.end()) sum += *it; s.test[FIND].t2 = clock(); s.test[FIND].sum = sum; s.test[ITER].t1 = clock(); sum = 0; - c_forrange (R) c_forrange (i, N) sum += con[i]; + c_forloop (R) c_forloop (i, N) sum += con[i]; s.test[ITER].t2 = clock(); s.test[ITER].sum = sum; s.test[DESTRUCT].t1 = clock(); @@ -71,27 +71,27 @@ Sample test_stc_vector() { s.test[INSERT].t1 = clock(); container con = cvec_x_init(); csrandom(seed); - c_forrange (N) cvec_x_push_back(&con, crandom() & mask1); + c_forloop (N) cvec_x_push_back(&con, crandom() & mask1); s.test[INSERT].t2 = clock(); s.test[INSERT].sum = cvec_x_size(&con); s.test[ERASE].t1 = clock(); - c_forrange (N) { cvec_x_pop_back(&con); } + c_forloop (N) { cvec_x_pop_back(&con); } s.test[ERASE].t2 = clock(); s.test[ERASE].sum = cvec_x_size(&con); cvec_x_drop(&con); }{ csrandom(seed); container con = cvec_x_init(); - c_forrange (N) cvec_x_push_back(&con, crandom() & mask2); + c_forloop (N) cvec_x_push_back(&con, crandom() & mask2); s.test[FIND].t1 = clock(); size_t sum = 0; //cvec_x_iter it, end = cvec_x_end(&con); - //c_forrange (S) if ((it = cvec_x_find(&con, crandom() & mask2)).ref != end.ref) sum += *it.ref; + //c_forloop (S) if ((it = cvec_x_find(&con, crandom() & mask2)).ref != end.ref) sum += *it.ref; s.test[FIND].t2 = clock(); s.test[FIND].sum = sum; s.test[ITER].t1 = clock(); sum = 0; - c_forrange (R) c_forrange (i, N) sum += con.data[i]; + c_forloop (R) c_forloop (i, N) sum += con.data[i]; s.test[ITER].t2 = clock(); s.test[ITER].sum = sum; s.test[DESTRUCT].t1 = clock(); @@ -105,30 +105,30 @@ Sample test_stc_vector() { int main(int argc, char* argv[]) { Sample std_s[SAMPLES + 1] = {{NULL}}, stc_s[SAMPLES + 1] = {{NULL}}; - c_forrange (i, int, SAMPLES) { + c_forloop (i, SAMPLES) { std_s[i] = test_std_vector(); stc_s[i] = test_stc_vector(); - if (i > 0) c_forrange (j, int, N_TESTS) { + if (i > 0) c_forloop (j, N_TESTS) { if (secs(std_s[i].test[j]) < secs(std_s[0].test[j])) std_s[0].test[j] = std_s[i].test[j]; if (secs(stc_s[i].test[j]) < secs(stc_s[0].test[j])) stc_s[0].test[j] = stc_s[i].test[j]; - if (stc_s[i].test[j].sum != stc_s[0].test[j].sum) printf("Error in sum: test %d, sample %d\n", i, j); + if (stc_s[i].test[j].sum != stc_s[0].test[j].sum) printf("Error in sum: test %lld, sample %lld\n", i, j); } } const char* comp = argc > 1 ? argv[1] : "test"; bool header = (argc > 2 && argv[2][0] == '1'); float std_sum = 0, stc_sum = 0; - c_forrange (j, N_TESTS) { + c_forloop (j, N_TESTS) { std_sum += secs(std_s[0].test[j]); stc_sum += secs(stc_s[0].test[j]); } if (header) printf("Compiler,Library,C,Method,Seconds,Ratio\n"); - c_forrange (j, N_TESTS) + c_forloop (j, N_TESTS) printf("%s,%s n:%d,%s,%.3f,%.3f\n", comp, std_s[0].name, N, operations[j], secs(std_s[0].test[j]), 1.0f); printf("%s,%s n:%d,%s,%.3f,%.3f\n", comp, std_s[0].name, N, "total", std_sum, 1.0f); - c_forrange (j, N_TESTS) + c_forloop (j, N_TESTS) printf("%s,%s n:%d,%s,%.3f,%.3f\n", comp, stc_s[0].name, N, operations[j], secs(stc_s[0].test[j]), secs(std_s[0].test[j]) ? secs(stc_s[0].test[j])/secs(std_s[0].test[j]) : 1.0f); printf("%s,%s n:%d,%s,%.3f,%.3f\n", comp, stc_s[0].name, N, "total", stc_sum, stc_sum/std_sum); } diff --git a/docs/ccommon_api.md b/docs/ccommon_api.md index 2d26fbe3..70033445 100644 --- a/docs/ccommon_api.md +++ b/docs/ccommon_api.md @@ -180,37 +180,36 @@ c_forlist (i, csmap_ii_raw, { {23,1}, {3,2}, {7,3}, {5,4}, {12,5} }) c_foreach (i, csmap_ii, map) printf(" %d", i.ref->first); -// out: 3 5 7 12 23 +// 3 5 7 12 23 csmap_ii_iter it = csmap_ii_find(&map, 7); c_foreach (i, csmap_ii, it, csmap_ii_end(&map)) printf(" %d", i.ref->first); -// out: 7 12 23 +// 7 12 23 c_forpair (id, count, csmap_ii, map) printf(" (%d %d)", *_.id, *_.count); -// out: (3 2) (5 4) (7 3) (12 5) (23 1) +// (3 2) (5 4) (7 3) (12 5) (23 1) ``` -### c_forrange -Abstaction for iterating sequence of numbers. Like python's ***for i in range()*** loop. +### c_forloop +Abstaction for iterating sequence of numbers. Like python's **for** *i* **in** *range()* loop. -| Usage | Python equivalent | -|:----------------------------------------------|:-------------------------------------| -| `c_forrange (stop)` | `for _ in range(stop):` | -| `c_forrange (i, stop) // IntType = size_t` | `for i in range(stop):` | -| `c_forrange (i, IntType, stop)` | `for i in range(stop):` | -| `c_forrange (i, IntType, start, stop)` | `for i in range(start, stop):` | -| `c_forrange (i, IntType, start, stop, step)` | `for i in range(start, stop, step):` | +| Usage | Python equivalent | +|:--------------------------------------------|:-------------------------------------| +| `c_forloop (stop)` | `for _ in range(stop):` | +| `c_forloop (i, stop) // i type = long long` | `for i in range(stop):` | +| `c_forloop (i, start, stop)` | `for i in range(start, stop):` | +| `c_forloop (i, start, stop, step)` | `for i in range(start, stop, step):` | ```c -c_forrange (5) printf("x"); +c_forloop (5) printf("x"); // xxxxx -c_forrange (i, 5) printf(" %" PRIuMAX "", i); +c_forloop (i, 5) printf(" %lld", i); // 0 1 2 3 4 -c_forrange (i, int, -3, 3) printf(" %d", i); +c_forloop (i, -3, 3) printf(" %lld", i); // -3 -2 -1 0 1 2 -c_forrange (i, int, 30, 0, -5) printf(" %d", i); +c_forloop (i, 30, 0, -5) printf(" %lld", i); // 30 25 20 15 10 5 ``` @@ -244,7 +243,7 @@ bool isPrime(int i) { int main() { c_auto (IVec, vec) { - c_forrange (i, 1000) IVec_push(&vec, 1000000 + i); + c_forloop (i, 1000) IVec_push(&vec, 1000000 + i); c_forfilter (i, IVec, vec, isOdd(*i.ref) @@ -261,12 +260,12 @@ int main() { Note that `c_flt_take()` is given as an optional argument, which makes the loop stop when it becomes false (for efficiency). Chaining it after `isPrime()` instead will give same result, but the full input is processed. ### crange -**crange** is a number sequence generator type. The **crange_value** type is `long long`. Below, *start*, *end*, *step* are type *crange_value*: +**crange** is a number sequence generator type. The **crange_value** type is `long long`. Below, *start*, *stop*, *step* are type *crange_value*: ```c crange crange_init(void); // will generate 0, 1, 2, ... -crange crange_from(start); // will generate start, start+1, ... -crange crange_from(start, end); // will generate start, start+1, ... end-1 -crange crange_from(start, end, step); // will generate start, start+step, ... upto-not-including end +crange crange_make(stop); // will generate 0, 1, ..., stop-1 +crange crange_make(start, stop); // will generate start, start+1, ... stop-1 +crange crange_make(start, stop, step); // will generate start, start+step, ... upto-not-including stop // note that step may be negative. crange_iter crange_begin(crange* self); crange_iter crange_end(crange* self); @@ -281,7 +280,7 @@ c_forfilter (i, crange, r1, // 2 3 5 7 11 13 17 19 23 29 31 // 2. The 11 first primes: -crange r2 = crange_from(3, INTMAX_MAX, 2); +crange r2 = crange_make(3, INTMAX_MAX, 2); printf("2"); c_forfilter (i, crange, r2, isPrime(*i.ref) diff --git a/docs/clist_api.md b/docs/clist_api.md index 9927087d..58afb64a 100644 --- a/docs/clist_api.md +++ b/docs/clist_api.md @@ -114,7 +114,7 @@ int main() { c_forlist (i, double, {10., 20., 30., 40., 50., 60., 70., 80., 90.}) DList_push_back(&list, *i.ref); - c_forrange (i, int, 1, 10) { + c_forloop (i, 1, 10) { if (i & 1) DList_push_front(&list, (double) i); else DList_push_back(&list, (double) i); } diff --git a/docs/cpque_api.md b/docs/cpque_api.md index 8b990be8..f3e36a3d 100644 --- a/docs/cpque_api.md +++ b/docs/cpque_api.md @@ -76,16 +76,16 @@ int main() c_auto (cpque_i, heap) { // Push ten million random numbers to priority queue. - c_forrange (N) + c_forloop (N) cpque_i_push(&heap, stc64_uniform(&rng, &dist)); // Add some negative ones. int nums[] = {-231, -32, -873, -4, -343}; - c_forrange (i, c_arraylen(nums)) + c_forloop (i, c_arraylen(nums)) cpque_i_push(&heap, nums[i]); // Extract and display the fifty smallest. - c_forrange (50) { + c_forloop (50) { printf("%" PRIdMAX " ", *cpque_i_top(&heap)); cpque_i_pop(&heap); } diff --git a/docs/cqueue_api.md b/docs/cqueue_api.md index a8be9e86..43f953b3 100644 --- a/docs/cqueue_api.md +++ b/docs/cqueue_api.md @@ -68,10 +68,10 @@ int main() { cqueue_i Q = cqueue_i_init(); // push() and pop() a few. - c_forrange (i, 20) + c_forloop (i, 20) cqueue_i_push(&Q, i); - c_forrange (5) + c_forloop (5) cqueue_i_pop(&Q); c_foreach (i, cqueue_i, Q) diff --git a/docs/crandom_api.md b/docs/crandom_api.md index 3e6ae8f0..d6180490 100644 --- a/docs/crandom_api.md +++ b/docs/crandom_api.md @@ -94,7 +94,7 @@ int main() // Create histogram map csmap_i mhist = csmap_i_init(); - c_forrange (N) { + c_forloop (N) { int index = (int) round( stc64_normalf(&rng, &dist) ); csmap_i_emplace(&mhist, index, 0).ref->second += 1; } diff --git a/docs/cregex_api.md b/docs/cregex_api.md index 2a0b22a8..66b97834 100644 --- a/docs/cregex_api.md +++ b/docs/cregex_api.md @@ -128,14 +128,14 @@ To iterate multiple matches in an input string, you may use ```c csview match[5] = {0}; while (cregex_find(&re, input, match, cre_m_next) == cre_success) - c_forrange (k, int, cregex_captures(&re)) - printf("submatch %d: %.*s\n", k, c_ARGsv(match[k])); + c_forloop (k, cregex_captures(&re)) + printf("submatch %lld: %.*s\n", k, c_ARGsv(match[k])); ``` There is also a safe macro which simplifies this: ```c c_formatch (it, &re, input) - c_forrange (k, int, cregex_captures(&re)) - printf("submatch %d: %.*s\n", k, c_ARGsv(it.match[k])); + c_forloop (k, cregex_captures(&re)) + printf("submatch %lld: %.*s\n", k, c_ARGsv(it.match[k])); ``` ## Using cregex in a project diff --git a/examples/arc_demo.c b/examples/arc_demo.c index 688fe72f..345432b6 100644 --- a/examples/arc_demo.c +++ b/examples/arc_demo.c @@ -25,7 +25,7 @@ int main() c_auto (csset_Arc, set) // declare and init set, call csset_Arc_drop() at scope exit { const int years[] = {2021, 2012, 2022, 2015}; - c_forrange (i, c_arraylen(years)) + c_forloop (i, c_arraylen(years)) cvec_Arc_push_back(&vec, Arc_make(years[i])); printf("vec:"); diff --git a/examples/birthday.c b/examples/birthday.c index e09d84f1..8b23f7ab 100644 --- a/examples/birthday.c +++ b/examples/birthday.c @@ -21,7 +21,7 @@ static void test_repeats(void) c_auto (cmap_ic, m) { cmap_ic_reserve(&m, N); - c_forrange (i, N) { + c_forloop (i, N) { uint64_t k = stc64_rand(&rng) & mask; int v = cmap_ic_insert(&m, k, 0).ref->second += 1; if (v > 1) printf("repeated value %" PRIuMAX " (%d) at 2^%d\n", k, v, (int) log2((double) i)); @@ -42,7 +42,7 @@ void test_distribution(void) const size_t N = 1ull << BITS ; c_auto (cmap_x, map) { - c_forrange (N) { + c_forloop (N) { uint64_t k = stc64_rand(&rng); cmap_x_insert(&map, k & 0xf, 0).ref->second += 1; } diff --git a/examples/bits.c b/examples/bits.c index c6e70517..c89ad7d3 100644 --- a/examples/bits.c +++ b/examples/bits.c @@ -17,7 +17,7 @@ int main() printf(" str: %s\n", cbits_to_str(&set, str, 0, -1)); printf("%4" PRIuMAX ": ", cbits_size(&set)); - c_forrange (i, cbits_size(&set)) + c_forloop (i, cbits_size(&set)) printf("%d", cbits_test(&set, i)); puts(""); @@ -27,12 +27,12 @@ int main() cbits_resize(&set, 102, true); cbits_set_value(&set, 99, false); printf("%4" PRIuMAX ": ", cbits_size(&set)); - c_forrange (i, cbits_size(&set)) + c_forloop (i, cbits_size(&set)) printf("%d", cbits_test(&set, i)); puts("\nIterate:"); printf("%4" PRIuMAX ": ", cbits_size(&set)); - c_forrange (i, cbits_size(&set)) + c_forloop (i, cbits_size(&set)) printf("%d", cbits_test(&set, i)); puts(""); @@ -42,19 +42,19 @@ int main() cbits_set(&s2, 17); cbits_set(&s2, 18); printf(" new: "); - c_forrange (i, cbits_size(&s2)) + c_forloop (i, cbits_size(&s2)) printf("%d", cbits_test(&s2, i)); puts(""); printf(" xor: "); cbits_xor(&set, &s2); - c_forrange (i, cbits_size(&set)) + c_forloop (i, cbits_size(&set)) printf("%d", cbits_test(&set, i)); puts(""); cbits_set_all(&set, false); printf("%4" PRIuMAX ": ", cbits_size(&set)); - c_forrange (i, cbits_size(&set)) + c_forloop (i, cbits_size(&set)) printf("%d", cbits_test(&set, i)); puts(""); } diff --git a/examples/bits2.c b/examples/bits2.c index 3f3085b6..0161376b 100644 --- a/examples/bits2.c +++ b/examples/bits2.c @@ -24,19 +24,19 @@ int main() Bits_reset(&s2, 66); Bits_reset(&s2, 67); printf(" s2: "); - c_forrange (i, Bits_size(&s2)) + c_forloop (i, Bits_size(&s2)) printf("%d", Bits_test(&s2, i)); puts(""); printf("xor: "); Bits_xor(&s1, &s2); - c_forrange (i, Bits_size(&s1)) + c_forloop (i, Bits_size(&s1)) printf("%d", Bits_test(&s1, i)); puts(""); printf("all: "); Bits_set_pattern(&s1, 0x3333333333333333); - c_forrange (i, Bits_size(&s1)) + c_forloop (i, Bits_size(&s1)) printf("%d", Bits_test(&s1, i)); puts(""); } diff --git a/examples/books.c b/examples/books.c index fb9e4564..eed19540 100644 --- a/examples/books.c +++ b/examples/books.c @@ -41,7 +41,7 @@ int main() // Look up the values associated with some keys. const char* to_find[] = {"Pride and Prejudice", "Alice's Adventure in Wonderland"}; - c_forrange (i, c_arraylen(to_find)) { + c_forloop (i, c_arraylen(to_find)) { const cmap_str_value* b; if ((b = cmap_str_get(&book_reviews, to_find[i]))) printf("%s: %s\n", cstr_str(&b->first), cstr_str(&b->second)); diff --git a/examples/convert.c b/examples/convert.c index 74f4f865..a8260564 100644 --- a/examples/convert.c +++ b/examples/convert.c @@ -37,7 +37,7 @@ int main() cvec_str_emplace_back(&keys, cstr_str(&i.ref->first)); cvec_str_emplace_back(&values, cstr_str(&i.ref->second)); } - c_forrange (i, cvec_str_size(&keys)) + c_forloop (i, cvec_str_size(&keys)) printf(" %s: %s\n", cstr_str(keys.data + i), cstr_str(values.data + i)); puts("\nCOPY VEC TO LIST:"); diff --git a/examples/cpque.c b/examples/cpque.c index 5866f17b..183f83c1 100644 --- a/examples/cpque.c +++ b/examples/cpque.c @@ -31,15 +31,15 @@ int main() c_auto (ipque, q, q2, q3) // init() and defered drop() { less_fn = int_less; - c_forrange (i, n) ipque_push(&q, data[i]); + c_forloop (i, n) ipque_push(&q, data[i]); print_queue(q); less_fn = int_greater; - c_forrange (i, n) ipque_push(&q2, data[i]); + c_forloop (i, n) ipque_push(&q2, data[i]); print_queue(q2); less_fn = int_lambda; - c_forrange (i, n) ipque_push(&q3, data[i]); + c_forloop (i, n) ipque_push(&q3, data[i]); print_queue(q3); } } diff --git a/examples/forfilter.c b/examples/forfilter.c index 29128836..3ac7821b 100644 --- a/examples/forfilter.c +++ b/examples/forfilter.c @@ -59,7 +59,7 @@ fn main() { void demo2(void) { c_auto (IVec, vector) { - crange rv = crange_from(1); + crange rv = crange_make(1, INTMAX_MAX); c_forfilter (x, crange, rv, flt_odd(x) , c_flt_take(x, 5)) @@ -121,7 +121,7 @@ void demo5(void) #define flt_even(i) ((*i.ref & 1) == 0) #define flt_mid_decade(i) ((*i.ref % 10) != 0) puts("demo5:"); - crange r1 = crange_from(1963); + crange r1 = crange_make(1963, INTMAX_MAX); c_forfilter (i, crange, r1, c_flt_drop(i,15) && c_flt_dropwhile(i, flt_mid_decade(i)) diff --git a/examples/gauss1.c b/examples/gauss1.c index da6d73f4..81d57852 100644 --- a/examples/gauss1.c +++ b/examples/gauss1.c @@ -32,7 +32,7 @@ int main() c_auto (cvec_ii, histvec) c_auto (cmap_ii, histmap) { - c_forrange (N) { + c_forloop (N) { int index = (int) round( stc64_normalf(&rng, &dist) ); cmap_ii_insert(&histmap, index, 0).ref->second += 1; } diff --git a/examples/gauss2.c b/examples/gauss2.c index 2e07c5a5..6bbd7fb3 100644 --- a/examples/gauss2.c +++ b/examples/gauss2.c @@ -25,7 +25,7 @@ int main() // Create and init histogram map with defered destruct c_auto (csmap_int, mhist) { - c_forrange (N) { + c_forloop (N) { int index = (int) round( stc64_normalf(&rng, &dist) ); csmap_int_insert(&mhist, index, 0).ref->second += 1; } diff --git a/examples/inits.c b/examples/inits.c index ab6cdce9..875406e1 100644 --- a/examples/inits.c +++ b/examples/inits.c @@ -40,7 +40,7 @@ int main(void) const float nums[] = {4.0f, 2.0f, 5.0f, 3.0f, 1.0f}; // PRIORITY QUEUE - c_forrange (i, c_arraylen(nums)) + c_forloop (i, c_arraylen(nums)) cpque_f_push(&floats, nums[i]); puts("\npop and show high priorites first:"); diff --git a/examples/list.c b/examples/list.c index e94a9f18..42be81f3 100644 --- a/examples/list.c +++ b/examples/list.c @@ -17,7 +17,7 @@ int main() { stc64_t rng = stc64_new(1234); stc64_uniformf_t dist = stc64_uniformf_new(100.0f, n); int m = 0; - c_forrange (n) + c_forloop (n) clist_fx_push_back(&list, stc64_uniformf(&rng, &dist)), ++m; double sum = 0.0; printf("sumarize %d:\n", m); diff --git a/examples/prime.c b/examples/prime.c index d2a95af5..12d33a9e 100644 --- a/examples/prime.c +++ b/examples/prime.c @@ -39,9 +39,9 @@ int main(void) puts(""); int k = 20; - c_forrange (i, intptr_t, n-1, 1, -2) { + c_forloop (i, n-1, 1, -2) { if (k == 0) break; - else if (cbits_test(&primes, i>>1)) printf("%" PRIdMAX "\n", i), k--; + else if (cbits_test(&primes, i>>1)) printf("%lld\n", i), k--; } puts(""); } diff --git a/examples/priority.c b/examples/priority.c index d801c118..452ed9d4 100644 --- a/examples/priority.c +++ b/examples/priority.c @@ -16,18 +16,18 @@ int main() { { // Push ten million random numbers to priority queue printf("Push %" PRIuMAX " numbers\n", N); - c_forrange (N) + c_forloop (N) cpque_i_push(&heap, stc64_uniform(&rng, &dist)); // push some negative numbers too. c_forlist (i, int, {-231, -32, -873, -4, -343}) cpque_i_push(&heap, *i.ref); - c_forrange (N) + c_forloop (N) cpque_i_push(&heap, stc64_uniform(&rng, &dist)); puts("Extract the hundred smallest."); - c_forrange (100) { + c_forloop (100) { printf("%" PRIdMAX " ", *cpque_i_top(&heap)); cpque_i_pop(&heap); } diff --git a/examples/queue.c b/examples/queue.c index cc6f8302..7be25367 100644 --- a/examples/queue.c +++ b/examples/queue.c @@ -14,12 +14,12 @@ int main() { c_auto (cqueue_i, queue) { // Push ten million random numbers onto the queue. - c_forrange (n) + c_forloop (n) cqueue_i_push(&queue, stc64_uniform(&rng, &dist)); // Push or pop on the queue ten million times printf("%d\n", n); - c_forrange (n) { // forrange uses initial n only. + c_forloop (n) { // forrange uses initial n only. int r = stc64_uniform(&rng, &dist); if (r & 1) ++n, cqueue_i_push(&queue, r); diff --git a/examples/random.c b/examples/random.c index 30751a6c..99001a1a 100644 --- a/examples/random.c +++ b/examples/random.c @@ -14,7 +14,7 @@ int main() printf("Compare speed of full and unbiased ranged random numbers...\n"); sum = 0; before = clock(); - c_forrange (N) { + c_forloop (N) { sum += (uint32_t) stc64_rand(&rng); } diff = clock() - before; @@ -24,7 +24,7 @@ int main() rng = stc64_new(seed); sum = 0; before = clock(); - c_forrange (N) { + c_forloop (N) { sum += stc64_uniform(&rng, &dist1); // unbiased } diff = clock() - before; @@ -33,7 +33,7 @@ int main() sum = 0; rng = stc64_new(seed); before = clock(); - c_forrange (N) { + c_forloop (N) { sum += stc64_rand(&rng) % (range + 1); // biased } diff = clock() - before; diff --git a/examples/regex2.c b/examples/regex2.c index 28291915..d3a22f5a 100644 --- a/examples/regex2.c +++ b/examples/regex2.c @@ -15,7 +15,7 @@ int main() }; c_with (cregex re = cregex_init(), cregex_drop(&re)) - c_forrange (i, c_arraylen(s)) + c_forloop (i, c_arraylen(s)) { int res = cregex_compile(&re, s[i].pattern, 0); if (res < 0) { @@ -25,8 +25,8 @@ int main() printf("input: %s\n", s[i].input); c_formatch (j, &re, s[i].input) { - c_forrange (k, cregex_captures(&re)) - printf(" submatch %d: %.*s\n", (int)k, c_ARGsv(j.match[k])); + c_forloop (k, cregex_captures(&re)) + printf(" submatch %lld: %.*s\n", k, c_ARGsv(j.match[k])); puts(""); } } diff --git a/examples/stack.c b/examples/stack.c index 580b6428..fad2093b 100644 --- a/examples/stack.c +++ b/examples/stack.c @@ -14,12 +14,12 @@ int main() { c_auto (cstack_i, stack) c_auto (cstack_c, chars) { - c_forrange (i, int, 101) + c_forloop (i, 101) cstack_i_push(&stack, i*i); printf("%d\n", *cstack_i_top(&stack)); - c_forrange (i, int, 90) + c_forloop (i, 90) cstack_i_pop(&stack); c_foreach (i, cstack_i, stack) diff --git a/include/stc/cbits.h b/include/stc/cbits.h index 06871934..fcb5808d 100644 --- a/include/stc/cbits.h +++ b/include/stc/cbits.h @@ -33,7 +33,7 @@ int main() { cbits_resize(&bset, 43, false); printf("%4zu: ", cbits_size(&bset)); - c_forrange (i, cbits_size(&bset)) + c_forloop (i, cbits_size(&bset)) printf("%d", cbits_at(&bset, i)); puts(""); cbits_set(&bset, 28); @@ -43,7 +43,7 @@ int main() { cbits_set_value(&bset, 99, false); printf("%4zu: ", cbits_size(&bset)); - c_forrange (i, cbits_size(&bset)) + c_forloop (i, cbits_size(&bset)) printf("%d", cbits_at(&bset, i)); puts(""); } diff --git a/include/stc/ccommon.h b/include/stc/ccommon.h index 2b3cfd76..70d829ff 100644 --- a/include/stc/ccommon.h +++ b/include/stc/ccommon.h @@ -193,6 +193,7 @@ STC_INLINE char* c_strnstrn(const char *s, const char *needle, ; _._it.ref && (_.key = &_._it.ref->first, _.val = &_._it.ref->second) \ ; C##_next(&_._it)) +// [deprecated]: #define c_forrange(...) c_MACRO_OVERLOAD(c_forrange, __VA_ARGS__) #define c_forrange1(stop) c_forrange4(_c_i, size_t, 0, stop) #define c_forrange2(i, stop) c_forrange4(i, size_t, 0, stop) @@ -202,16 +203,24 @@ STC_INLINE char* c_strnstrn(const char *s, const char *needle, #define c_forrange5(i, itype, start, stop, step) \ for (itype i=start, _inc=step, _end=(stop) - (_inc > 0) \ ; (_inc > 0) ^ (i > _end); i += _inc) +// [new]: +#define c_forloop(...) c_MACRO_OVERLOAD(c_forloop, __VA_ARGS__) +#define c_forloop1(stop) for (crange_value _i=0, _end=stop; _i<_end; ++_i) +#define c_forloop2(i, stop) c_forloop4(i, 0, stop, 1) +#define c_forloop3(i, start, stop) c_forloop4(i, start, stop, 1) +#define c_forloop4(i, start, stop, step) \ + for (crange_value i=start, _inc=step, _end=(stop) - (_inc > 0) \ + ; (_inc > 0) ^ (i > _end); i += _inc) typedef long long crange_value; struct {crange_value val, end, step; } typedef crange; struct {crange_value *ref, end, step; } typedef crange_iter; -#define crange_init() crange_from3(0, INTMAX_MAX, 1) -#define crange_from(...) c_MACRO_OVERLOAD(crange_from, __VA_ARGS__) -#define crange_from1(start) crange_from3(start, INTMAX_MAX, 1) -#define crange_from2(start, end) crange_from3(start, end, 1) -STC_INLINE crange crange_from3(crange_value start, crange_value finish, crange_value step) - { crange r = {start, finish - (step > 0), step}; return r; } +#define crange_init() crange_make3(0, INTMAX_MAX, 1) +#define crange_make(...) c_MACRO_OVERLOAD(crange_make, __VA_ARGS__) +#define crange_make1(stop) crange_make3(0, stop, 1) +#define crange_make2(start, stop) crange_make3(start, stop, 1) +STC_INLINE crange crange_make3(crange_value start, crange_value stop, crange_value step) + { crange r = {start, stop - (step > 0), step}; return r; } STC_INLINE crange_iter crange_begin(crange* self) { crange_iter it = {&self->val, self->end, self->step}; return it; } STC_INLINE crange_iter crange_end(crange* self) diff --git a/src/checkauto.l b/src/checkauto.l index 384b3855..00f7ef45 100644 --- a/src/checkauto.l +++ b/src/checkauto.l @@ -34,6 +34,9 @@ STR \"([^"\\]|\\.)*\" c_foreach | c_forpair | c_forrange | +c_forloop | +c_forfilter | +c_forwhile | for | while | switch { block_type |= LOOP; state = BRACES; } |
