summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--docs/ccommon_api.md4
-rw-r--r--examples/cpque.c24
-rw-r--r--examples/inits.c2
-rw-r--r--examples/read.c2
-rw-r--r--examples/sidebyside.cpp53
-rw-r--r--include/stc/ccommon.h5
-rw-r--r--include/stc/template.h12
7 files changed, 53 insertions, 49 deletions
diff --git a/docs/ccommon_api.md b/docs/ccommon_api.md
index 9d2baea6..82431d95 100644
--- a/docs/ccommon_api.md
+++ b/docs/ccommon_api.md
@@ -167,7 +167,7 @@ c_forrange (i, int, 30, 0, -5) printf(" %d", i);
// 30 25 20 15 10 5
```
-### c_apply, c_apply_arr, c_pair, c_find_if, c_find_it
+### c_apply, c_apply_array, c_pair, c_find_if, c_find_it
**c_apply** applies an expression on a container with each of the elements in the given array:
```c
// apply multiple push_backs
@@ -177,7 +177,7 @@ c_apply(v, cvec_i_push_back(&vec, v), int, {1, 2, 3});
c_apply(v, cmap_i_insert(&map, c_pair(v)), cmap_i_raw, { {4, 5}, {6, 7} });
int arr[] = {1, 2, 3};
-c_apply_arr(v, cvec_i_push_back(&vec, v), int, arr, c_arraylen(arr));
+c_apply_array(v, cvec_i_push_back(&vec, v), int, arr, c_arraylen(arr));
```
**c_find_if**, **c_find_in** searches linearily in containers using a predicate
```
diff --git a/examples/cpque.c b/examples/cpque.c
index 8a3564f0..2c08f796 100644
--- a/examples/cpque.c
+++ b/examples/cpque.c
@@ -1,20 +1,16 @@
// Implements c++ example: https://en.cppreference.com/w/cpp/container/priority_queue
#include <stdio.h>
+#include <stdbool.h>
// Example of dynamic compare function
-static int (*icmp_fn)(const int* x, const int* y);
+static bool (*less_fn)(const int* x, const int* y);
#define i_val int
-#define i_cmp icmp_fn
+#define i_less less_fn
#define i_type ipque
#include <stc/cpque.h>
-#define imix_less(left, right) ((*(left) ^ 1) < (*(right) ^ 1))
-static int imax_cmp(const int* x, const int* y) { return *x - *y; }
-static int imin_cmp(const int* x, const int* y) { return *y - *x; }
-static int imix_cmp(const int* x, const int* y) { return c_less_cmp(imix_less, x, y); }
-
void print_queue(ipque q) {
ipque copy = ipque_clone(q);
while (!ipque_empty(copy)) {
@@ -25,23 +21,27 @@ void print_queue(ipque q) {
ipque_drop(&copy);
}
+static bool int_less(const int* x, const int* y) { return *x < *y; }
+static bool int_greater(const int* x, const int* y) { return *x > *y; }
+static bool int_lambda(const int* x, const int* y) { return (*x ^ 1) < (*y ^ 1); }
+
int main()
{
const int data[] = {1,8,5,6,3,4,0,9,7,2}, n = c_arraylen(data);
c_auto (ipque, q, q2, q3) // init() and defered drop()
{
- icmp_fn = imax_cmp;
+ less_fn = int_less;
c_forrange (i, n)
ipque_push(&q, data[i]);
print_queue(q);
- icmp_fn = imin_cmp;
- c_apply_arr(v, ipque_push(&q2, *v), const int, data, n);
+ less_fn = int_greater;
+ c_apply_array(v, ipque_push(&q2, *v), const int, data, n);
print_queue(q2);
- icmp_fn = imix_cmp;
- c_apply_arr(v, ipque_push(&q3, *v), const int, data, n);
+ less_fn = int_lambda;
+ c_apply_array(v, ipque_push(&q3, *v), const int, data, n);
print_queue(q3);
}
}
diff --git a/examples/inits.c b/examples/inits.c
index d8114536..dc67075c 100644
--- a/examples/inits.c
+++ b/examples/inits.c
@@ -41,7 +41,7 @@ int main(void)
// PRIORITY QUEUE
- c_apply_arr(v, cpque_f_push(&floats, *v), const float, nums, c_arraylen(nums));
+ c_apply_array(v, cpque_f_push(&floats, *v), const float, nums, c_arraylen(nums));
puts("\npop and show high priorites first:");
while (! cpque_f_empty(floats)) {
diff --git a/examples/read.c b/examples/read.c
index 60698789..26fc46dd 100644
--- a/examples/read.c
+++ b/examples/read.c
@@ -9,7 +9,7 @@ cvec_str read_file(const char* name)
c_autovar (FILE* f = fopen(name, "r"), fclose(f))
c_autovar (cstr line = cstr_init(), cstr_drop(&line))
while (cstr_getline(&line, f))
- cvec_str_emplace_back(&vec, cstr_str(&line));
+ cvec_str_push(&vec, cstr_clone(line));
return vec;
}
diff --git a/examples/sidebyside.cpp b/examples/sidebyside.cpp
index 4d63496b..f2021436 100644
--- a/examples/sidebyside.cpp
+++ b/examples/sidebyside.cpp
@@ -1,54 +1,57 @@
#include <iostream>
#include <map>
#include <string>
-
-#define i_key_str
-#define i_val int
-#define i_tag si
-#include <stc/cmap.h>
+#include <stc/cstr.h>
#define i_key int
#define i_val int
#define i_tag ii
#include <stc/csmap.h>
+#define i_key_str
+#define i_val int
+#define i_tag si
+#include <stc/cmap.h>
+
int main() {
{
- std::map<std::string, int> food =
- {{"burger", 5}, {"pizza", 12}, {"steak", 15}};
+ std::map<int, int> hist;
+ hist.emplace(12, 100).first->second += 1;
+ hist.emplace(13, 100).first->second += 1;
+ hist.emplace(12, 100).first->second += 1;
- for (auto i: food)
+ for (auto i: hist)
std::cout << i.first << ", " << i.second << std::endl;
std::cout << std::endl;
}
- c_auto (cmap_si, food)
+
+ c_auto (csmap_ii, hist)
{
- c_apply(v, cmap_si_emplace(&food, c_pair(v)), cmap_si_raw,
- {{"burger", 5}, {"pizza", 12}, {"steak", 15}});
+ csmap_ii_insert(&hist, 12, 100).ref->second += 1;
+ csmap_ii_insert(&hist, 13, 100).ref->second += 1;
+ csmap_ii_insert(&hist, 12, 100).ref->second += 1;
- c_foreach (i, cmap_si, food)
- printf("%s, %d\n", i.ref->first.str, i.ref->second);
+ c_foreach (i, csmap_ii, hist)
+ printf("%d, %d\n", i.ref->first, i.ref->second);
puts("");
}
-
+ // ===================================================
{
- std::map<int, int> hist;
- ++ hist.emplace(12, 100).first->second;
- ++ hist.emplace(13, 100).first->second;
- ++ hist.emplace(12, 100).first->second;
+ std::map<std::string, int> food =
+ {{"burger", 5}, {"pizza", 12}, {"steak", 15}};
- for (auto i: hist)
+ for (auto i: food)
std::cout << i.first << ", " << i.second << std::endl;
std::cout << std::endl;
}
- c_auto (csmap_ii, hist)
+
+ c_auto (cmap_si, food)
{
- ++ csmap_ii_insert(&hist, 12, 100).ref->second;
- ++ csmap_ii_insert(&hist, 13, 100).ref->second;
- ++ csmap_ii_insert(&hist, 12, 100).ref->second;
+ c_apply(v, cmap_si_emplace(&food, c_pair(v)), cmap_si_raw,
+ {{"burger", 5}, {"pizza", 12}, {"steak", 15}});
- c_foreach (i, csmap_ii, hist)
- printf("%d, %d\n", i.ref->first, i.ref->second);
+ c_foreach (i, cmap_si, food)
+ printf("%s, %d\n", cstr_str(&i.ref->first), i.ref->second);
puts("");
}
}
diff --git a/include/stc/ccommon.h b/include/stc/ccommon.h
index 110114a0..9c00255a 100644
--- a/include/stc/ccommon.h
+++ b/include/stc/ccommon.h
@@ -88,8 +88,7 @@
#define c_arraylen(a) (sizeof (a)/sizeof *(a))
// x and y are i_keyraw* type, defaults to i_key*:
-#define c_less_cmp(less, x, y) ((less((y), (x))) - (less((x), (y))))
-#define c_default_cmp(x, y) c_less_cmp(c_default_less, x, y)
+#define c_default_cmp(x, y) (c_default_less(y, x) - c_default_less(x, y))
#define c_default_less(x, y) (*(x) < *(y))
#define c_default_eq(x, y) (*(x) == *(y))
#define c_memcmp_eq(x, y) (memcmp(x, y, sizeof *(x)) == 0)
@@ -209,7 +208,7 @@ STC_INLINE char* c_strnstrn(const char *s, const char *needle,
while (v != _c_end) { action; ++v; } \
} while (0)
-#define c_apply_arr(v, action, T, arr, n) do { \
+#define c_apply_array(v, action, T, arr, n) do { \
typedef T _c_T; \
_c_T *v = arr, *_c_end = v + (n); \
while (v != _c_end) { action; ++v; } \
diff --git a/include/stc/template.h b/include/stc/template.h
index 5de248e7..217b29d3 100644
--- a/include/stc/template.h
+++ b/include/stc/template.h
@@ -163,16 +163,18 @@
#ifndef i_keydrop
#define i_keydrop c_default_drop
#endif
-#ifdef i_less
- #define i_cmp(x, y) c_less_cmp(i_less, x, y)
-#endif
-#if !defined i_eq && defined i_cmp
+
+// i_eq, i_less, i_cmp, i_hash
+#if !defined i_eq && (defined i_cmp || defined i_less)
#define i_eq(x, y) !(i_cmp(x, y))
#elif !defined i_eq
#define i_eq c_default_eq
#endif
+#if !defined i_less && !defined i_cmp
+ #define i_less c_default_less
+#endif
#ifndef i_cmp
- #define i_cmp c_default_cmp
+ #define i_cmp(x, y) (i_less(y, x)) - (i_less(x, y))
#endif
#ifndef i_hash
#define i_hash c_default_hash