From 2686887e9091b3d56365b8ddc15db67324ee6727 Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Thu, 23 Sep 2021 20:55:07 +0200 Subject: Cleanup: Replaced c_emplace() macro with more general c_apply()/c_apply_pair() macros, and removed c_var() macro. Removed CX_emplace_items() member functions in containers used by c_emplace(). --- README.md | 12 ++++++------ docs/ccommon_api.md | 10 +++++----- docs/cdeq_api.md | 2 +- docs/clist_api.md | 11 ++++++----- docs/cmap_api.md | 6 +++--- docs/cpque_api.md | 3 +-- docs/cqueue_api.md | 1 - docs/cset_api.md | 46 ++++++++++++++++++++++------------------------ docs/csmap_api.md | 7 ++++--- docs/csset_api.md | 46 ++++++++++++++++++++++------------------------ docs/cstack_api.md | 1 - docs/cvec_api.md | 2 +- examples/advanced.c | 8 ++++---- examples/cpque.c | 5 ++--- examples/csmap_erase.c | 4 ++-- examples/csmap_find.c | 2 +- examples/csmap_insert.c | 6 +++--- examples/csset_erase.c | 2 +- examples/inits.c | 8 ++++---- examples/list.c | 2 +- examples/list_erase.c | 2 +- examples/list_splice.c | 4 ++-- examples/phonebook.c | 4 ++-- examples/priority.c | 2 +- examples/words.c | 2 +- include/stc/ccommon.h | 14 ++++++++++---- include/stc/cdeq.h | 6 ------ include/stc/clist.h | 6 ------ include/stc/cmap.h | 6 ------ include/stc/cpque.h | 7 ------- include/stc/csmap.h | 6 ------ include/stc/cstack.h | 3 --- include/stc/cvec.h | 5 ----- 33 files changed, 106 insertions(+), 145 deletions(-) diff --git a/README.md b/README.md index 3fc26682..02f4b02c 100644 --- a/README.md +++ b/README.md @@ -146,12 +146,12 @@ int main(void) { c_auto (csmap_int, map) { // add some elements to each container - c_emplace(cset_int, set, {10, 20, 30}); - c_emplace(cvec_pnt, vec, { {10, 1}, {20, 2}, {30, 3} }); - c_emplace(cdeq_int, deq, {10, 20, 30}); - c_emplace(clist_int, lst, {10, 20, 30}); - c_emplace(cstack_int, stk, {10, 20, 30}); - c_emplace(csmap_int, map, { {20, 2}, {10, 1}, {30, 3} }); + c_apply(cset_int, insert, &set, {10, 20, 30}); + c_apply(cvec_pnt, push_back, &vec, { {10, 1}, {20, 2}, {30, 3} }); + c_apply(cdeq_int, push_back, &deq, {10, 20, 30}); + c_apply(clist_int, push_back, &lst, {10, 20, 30}); + c_apply(cstack_int, push, &stk, {10, 20, 30}); + c_apply_pair(csmap_int, insert, &map, { {20, 2}, {10, 1}, {30, 3} }); // add one more element to each container cset_int_insert(&set, 40); diff --git a/docs/ccommon_api.md b/docs/ccommon_api.md index 75ebae2f..8e8cbb28 100644 --- a/docs/ccommon_api.md +++ b/docs/ccommon_api.md @@ -90,7 +90,7 @@ int main() #define i_key int #include ... -c_emplace(csset_x, set, {23, 3, 7, 5, 12}); +c_apply(csset_x, insert, &set, {23, 3, 7, 5, 12}); c_foreach (i, csset_x, set) printf(" %d", *i.ref); // 3 5 7 12 23 @@ -122,11 +122,11 @@ c_forrange (i, int, 30, 0, -5) printf(" %d", i); // 30 25 20 15 10 5 ``` -### c_var, c_emplace -**c_var** declares and initializes any container with an array of elements. **c_emplace** adds elements to any existing container: +### c_apply, c_apply_pair +**c_apply** will apply a method on an existing container with the given array elements: ```c -c_var (cvec_i, vec, {1, 2, 3}); // declare and emplace -c_emplace(cvec_i, vec, {4, 5, 6}); // adds to existing vec +c_apply (cvec_i, push_back, &vec, {1, 2, 3}); // apply multiple push_backs +c_apply_pair(cmap_i, insert, &map, { {4, 5}, {6, 7} }); // inserts to existing map ``` ### c_new, c_new_n, c_del, c_make diff --git a/docs/cdeq_api.md b/docs/cdeq_api.md index ea6f176e..bacb2f86 100644 --- a/docs/cdeq_api.md +++ b/docs/cdeq_api.md @@ -107,7 +107,7 @@ int main() { printf(" %d", *i.ref); puts(""); - c_emplace(cdeq_i, q, {1, 4, 5, 22, 33, 2}); + c_apply(cdeq_i, push_back, &q, {1, 4, 5, 22, 33, 2}); c_foreach (i, cdeq_i, q) printf(" %d", *i.ref); puts(""); diff --git a/docs/clist_api.md b/docs/clist_api.md index d6be8bfc..e1b8f0b1 100644 --- a/docs/clist_api.md +++ b/docs/clist_api.md @@ -56,7 +56,6 @@ void clist_X_pop_front(clist_X* self); void clist_X_push_back(clist_X* self, i_val value); // note: no pop_back(). void clist_X_emplace_back(clist_X* self, i_valraw raw); -void clist_X_emplace_items(clist_X *self, const clist_X_rawvalue_t arr[], size_t n); clist_X_iter_t clist_X_insert(clist_X* self, clist_X_iter_t it, i_val value); // return iter to new elem clist_X_iter_t clist_X_emplace(clist_X* self, clist_X_iter_t it, i_valraw raw); @@ -103,7 +102,8 @@ Interleave *push_front()* / *push_back()* then *sort()*: #include int main() { - c_var (clist_d, list, { + clist_d list = clist_d_init(); + c_apply(clist_d, push_back, &list, { 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0 }); @@ -143,7 +143,8 @@ Use of *erase_at()* and *erase_range()*: int main () { - c_var (clist_i, L, {10, 20, 30, 40, 50}); + clist_i L = clist_i_init(); + c_apply(clist_i, push_back, &L, {10, 20, 30, 40, 50}); // 10 20 30 40 50 clist_i_iter_t it = clist_i_begin(&L); // ^ clist_i_next(&it); @@ -178,8 +179,8 @@ Splice `[30, 40]` from *L2* into *L1* before `3`: int main() { c_auto (clist_i, L1, L2) { - c_emplace(clist_i, L1, {1, 2, 3, 4, 5}); - c_emplace(clist_i, L2, {10, 20, 30, 40, 50}); + c_apply(clist_i, push_back, &L1, {1, 2, 3, 4, 5}); + c_apply(clist_i, push_back, &L2, {10, 20, 30, 40, 50}); clist_i_iter_t i = clist_i_advance(clist_i_begin(&L1), 2); clist_i_iter_t j1 = clist_i_advance(clist_i_begin(&L2), 2), j2 = clist_i_advance(j1, 2); diff --git a/docs/cmap_api.md b/docs/cmap_api.md index 401e3cec..08f551e6 100644 --- a/docs/cmap_api.md +++ b/docs/cmap_api.md @@ -65,7 +65,6 @@ cmap_X_result_t cmap_X_put(cmap_X* self, i_key key, i_val mapped); cmap_X_result_t cmap_X_emplace(cmap_X* self, i_keyraw rkey, i_valraw rmapped); // no change if rkey in map cmap_X_result_t cmap_X_emplace_or_assign(cmap_X* self, i_keyraw rkey, i_valraw rmapped); // always update rmapped -void cmap_X_emplace_items(cmap_X* self, const cmap_X_rawvalue_t arr[], size_t n); size_t cmap_X_erase(cmap_X* self, i_keyraw rkey); // return 0 or 1 cmap_X_iter_t cmap_X_erase_at(cmap_X* self, cmap_X_iter_t it); // return iter after it @@ -124,7 +123,8 @@ void c_default_del(Type* val); // d int main() { // Create an unordered_map of three strings (that map to strings) - c_var (cmap_str, u, { + cmap_str u = cmap_str_init(); + c_apply_pair(cmap_str, emplace, &u, { {"RED", "#FF0000"}, {"GREEN", "#00FF00"}, {"BLUE", "#0000FF"} @@ -171,7 +171,7 @@ int main() uint32_t col = 0xcc7744ff; cmap_id idnames = cmap_id_init(); - c_emplace(cmap_id, idnames, { {100, "Red"}, {110, "Blue"} }); + c_apply_pair(cmap_id, emplace, &idnames, { {100, "Red"}, {110, "Blue"} }); /* replace existing mapped value: */ cmap_id_emplace_or_assign(&idnames, 110, "White"); diff --git a/docs/cpque_api.md b/docs/cpque_api.md index 0a4f7412..3b940648 100644 --- a/docs/cpque_api.md +++ b/docs/cpque_api.md @@ -36,7 +36,6 @@ const cpque_X_value_t* cpque_X_top(const cpque_X* self); void cpque_X_push(cpque_X* self, cpque_X_value_t value); void cpque_X_emplace(cpque_X* self, cpque_X_rawvalue_t raw); -void cpque_X_emplace_items(cpque_X *self, const cpque_X_rawvalue_t arr[], size_t n); void cpque_X_pop(cpque_X* self); void cpque_X_erase_at(cpque_X* self, size_t idx); @@ -74,7 +73,7 @@ int main() // Push ten million random numbers to priority queue, plus some negative ones. c_forrange (N) cpque_i_push(&heap, stc64_uniform(&rng, &dist)); - c_emplace(cpque_i, heap, {-231, -32, -873, -4, -343}); + c_apply(cpque_i, push, &heap, {-231, -32, -873, -4, -343}); // Extract and display the fifty smallest. c_forrange (50) { diff --git a/docs/cqueue_api.md b/docs/cqueue_api.md index c6db0411..d5843614 100644 --- a/docs/cqueue_api.md +++ b/docs/cqueue_api.md @@ -36,7 +36,6 @@ cqueue_X_value_t* cqueue_X_back(const cqueue_X* self); void cqueue_X_push(cqueue_X* self, cqueue_X_value_t value); void cqueue_X_emplace(cqueue_X* self, cqueue_X_rawvalue_t raw); -void cqueue_X_emplace_items(cqueue_X *self, const cqueue_X_rawvalue_t arr[], size_t n); void cqueue_X_pop(cqueue_X* self); diff --git a/docs/cset_api.md b/docs/cset_api.md index 22e65a5e..d6c4ab80 100644 --- a/docs/cset_api.md +++ b/docs/cset_api.md @@ -46,7 +46,6 @@ cset_X_iter_t cset_X_find(const cset_X* self, i_keyraw rkey); cset_X_result_t cset_X_insert(cset_X* self, i_key key); cset_X_result_t cset_X_emplace(cset_X* self, i_keyraw rkey); -void cset_X_emplace_items(cset_X* self, const i_keyraw arr[], size_t n); size_t cset_X_erase(cset_X* self, i_keyraw rkey); // return 0 or 1 cset_X_iter_t cset_X_erase_at(cset_X* self, cset_X_iter_t it); // return iter after it @@ -80,29 +79,28 @@ cset_X_value_t cset_X_value_clone(cset_X_value_t val); int main () { - cset_str first = cset_str_init(); // empty - c_var (cset_str, second, {"red", "green", "blue"}); - c_var (cset_str, third, {"orange", "pink", "yellow"}); - - cset_str fourth = cset_str_init(); - cset_str_emplace(&fourth, "potatoes"); - cset_str_emplace(&fourth, "milk"); - cset_str_emplace(&fourth, "flour"); - - cset_str fifth = cset_str_clone(second); - c_foreach (i, cset_str, third) - cset_str_emplace(&fifth, i.ref->str); - c_foreach (i, cset_str, fourth) - cset_str_emplace(&fifth, i.ref->str); - - c_del(cset_str, &first, &second, &third, &fourth); - - printf("fifth contains:\n\n"); - c_foreach (i, cset_str, fifth) - printf("%s\n", i.ref->str); - - cset_str_del(&fifth); - return 0; + c_auto (cset_str, fifth) + { + c_auto (cset_str, first, second) + c_auto (cset_str, third, fourth) + { + c_apply(cset_str, emplace, &second, {"red", "green", "blue"}); + c_apply(cset_str, emplace, &third, {"orange", "pink", "yellow"}); + + cset_str_emplace(&fourth, "potatoes"); + cset_str_emplace(&fourth, "milk"); + cset_str_emplace(&fourth, "flour"); + + fifth = cset_str_clone(second); + c_foreach (i, cset_str, third) + cset_str_emplace(&fifth, i.ref->str); + c_foreach (i, cset_str, fourth) + cset_str_emplace(&fifth, i.ref->str); + } + printf("fifth contains:\n\n"); + c_foreach (i, cset_str, fifth) + printf("%s\n", i.ref->str); + } } ``` Output: diff --git a/docs/csmap_api.md b/docs/csmap_api.md index 1a7ed78c..c6adcea9 100644 --- a/docs/csmap_api.md +++ b/docs/csmap_api.md @@ -58,7 +58,6 @@ csmap_X_result_t csmap_X_put(csmap_X* self, i_key key, i_val mapped); csmap_X_result_t csmap_X_emplace(csmap_X* self, i_keyraw rkey, i_valraw rmapped); // no change if rkey in map csmap_X_result_t csmap_X_emplace_or_assign(csmap_X* self, i_keyraw rkey, i_valraw rmapped); // always update rmapped -void csmap_X_emplace_items(csmap_X* self, const csmap_X_rawvalue_t arr[], size_t n); size_t csmap_X_erase(csmap_X* self, i_keyraw rkey); csmap_X_iter_t csmap_X_erase_at(csmap_X* self, csmap_X_iter_t it); // returns iter after it @@ -96,7 +95,8 @@ csmap_X_rawvalue_t csmap_X_value_toraw(csmap_X_value_t* pval); int main() { // Create an unordered_map of three strings (maps to string) - c_var (csmap_str, colors, { + csmap_str, colors = csmap_str_init(); + c_apply(csmap_str, emplace, &colors, { {"RED", "#FF0000"}, {"GREEN", "#00FF00"}, {"BLUE", "#0000FF"} @@ -140,7 +140,8 @@ This example uses a csmap with cstr as mapped value. int main() { uint32_t col = 0xcc7744ff; - c_var (csmap_id, idnames, { + csmap_id idnames = csmap_id_init(); + c_apply(csmap_id, push_back, &idnames, { {100, "Red"}, {110, "Blue"}, }); diff --git a/docs/csset_api.md b/docs/csset_api.md index 2d6c6486..f7cf0dc4 100644 --- a/docs/csset_api.md +++ b/docs/csset_api.md @@ -41,7 +41,6 @@ csset_X_value_t* csset_X_find_it(const csset_X* self, i_keyraw rkey, csset_X_ csset_X_result_t csset_X_insert(csset_X* self, i_key key); csset_X_result_t csset_X_emplace(csset_X* self, i_keyraw rkey); -void csset_X_emplace_items(csset_X* self, const i_keyraw arr[], size_t n); size_t csset_X_erase(csset_X* self, i_keyraw rkey); csset_X_iter_t csset_X_erase_at(csset_X* self, csset_X_iter_t it); // return iter after it @@ -75,29 +74,28 @@ csset_X_value_t csset_X_value_clone(csset_X_value_t val); int main () { - csset_str first = csset_str_init(); // empty - c_var (csset_str, second, {"red", "green", "blue"}); - c_var (csset_str, third, {"orange", "pink", "yellow"}); - - csset_str fourth = csset_str_init(); - csset_str_emplace(&fourth, "potatoes"); - csset_str_emplace(&fourth, "milk"); - csset_str_emplace(&fourth, "flour"); - - csset_str fifth = csset_str_clone(second); - c_foreach (i, csset_str, third) - csset_str_emplace(&fifth, i.ref->str); - c_foreach (i, csset_str, fourth) - csset_str_emplace(&fifth, i.ref->str); - - c_del(csset_str, &first, &second, &third, &fourth); - - printf("fifth contains:\n\n"); - c_foreach (i, csset_str, fifth) - printf("%s\n", i.ref->str); - - csset_str_del(&fifth); - return 0; +c_auto (csset_str, fifth) + { + c_auto (csset_str, first, second) + c_auto (csset_str, third, fourth) + { + c_apply(csset_str, emplace, &second, {"red", "green", "blue"}); + c_apply(csset_str, emplace, &third, {"orange", "pink", "yellow"}); + + csset_str_emplace(&fourth, "potatoes"); + csset_str_emplace(&fourth, "milk"); + csset_str_emplace(&fourth, "flour"); + + fifth = csset_str_clone(second); + c_foreach (i, csset_str, third) + csset_str_emplace(&fifth, i.ref->str); + c_foreach (i, csset_str, fourth) + csset_str_emplace(&fifth, i.ref->str); + } + printf("fifth contains:\n\n"); + c_foreach (i, csset_str, fifth) + printf("%s\n", i.ref->str); + } } ``` Output: diff --git a/docs/cstack_api.md b/docs/cstack_api.md index cd230508..79b515c6 100644 --- a/docs/cstack_api.md +++ b/docs/cstack_api.md @@ -35,7 +35,6 @@ cstack_X_value_t* cstack_X_top(const cstack_X* self); void cstack_X_push(cstack_X* self, cstack_X_value_t value); void cstack_X_emplace(cstack_X* self, cstack_X_rawvalue_t raw); -void cstack_X_emplace_items(cstack_X *self, const cstack_X_rawvalue_t arr[], size_t n); void cstack_X_pop(cstack_X* self); diff --git a/docs/cvec_api.md b/docs/cvec_api.md index 3b1ff265..ee02950f 100644 --- a/docs/cvec_api.md +++ b/docs/cvec_api.md @@ -114,7 +114,7 @@ int main() cvec_i_push_back(&vec, 13); // Append a set of numbers - c_emplace(cvec_i, vec, {7, 5, 16, 8}); + c_apply(cvec_i, push_back, &vec, {7, 5, 16, 8}); printf("initial:"); c_foreach (k, cvec_i, vec) { diff --git a/examples/advanced.c b/examples/advanced.c index 9ec73aa7..70aef8e8 100644 --- a/examples/advanced.c +++ b/examples/advanced.c @@ -48,10 +48,10 @@ static inline VikingRaw viking_toRaw(const Viking* vk) { int main() { c_autovar (cmap_vk vikings = cmap_vk_init(), cmap_vk_del(&vikings)) { - c_emplace(cmap_vk, vikings, { - { {"Einar", "Norway"}, 20}, - { {"Olaf", "Denmark"}, 24}, - { {"Harald", "Iceland"}, 12}, + c_apply_pair(cmap_vk, emplace, &vikings, { + {{"Einar", "Norway"}, 20}, + {{"Olaf", "Denmark"}, 24}, + {{"Harald", "Iceland"}, 12}, }); VikingRaw bjorn = {"Bjorn", "Sweden"}; cmap_vk_emplace_or_assign(&vikings, bjorn, 10); diff --git a/examples/cpque.c b/examples/cpque.c index 15bc2daa..17447341 100644 --- a/examples/cpque.c +++ b/examples/cpque.c @@ -42,16 +42,15 @@ int main() { c_forrange (n, c_arraylen(data)) cpque_imax_push(&q, n); - print_cpque_imax(q); - cpque_imin_emplace_items(&q2, data, c_arraylen(data)); + c_forrange (i, c_arraylen(data)) + cpque_imin_push(&q2, data[i]); print_cpque_imin(q2); // Using imix_less to compare elements. c_forrange (n, c_arraylen(data)) cpque_imix_push(&q3, n); - print_cpque_imix(q3); } } \ No newline at end of file diff --git a/examples/csmap_erase.c b/examples/csmap_erase.c index c8ecb5b1..66b45185 100644 --- a/examples/csmap_erase.c +++ b/examples/csmap_erase.c @@ -36,8 +36,8 @@ int main() c_auto (csmap_my, m2) { - // Fill in some data to test with, one at a time, using c_emplace() - c_emplace(csmap_my, m2, { + // Fill in some data to test with, one at a time, using c_apply_pair() + c_apply_pair(csmap_my, emplace, &m2, { {10, "Bob"}, {11, "Rob"}, {12, "Robert"}, diff --git a/examples/csmap_find.c b/examples/csmap_find.c index 55f7c23f..1b3320c9 100644 --- a/examples/csmap_find.c +++ b/examples/csmap_find.c @@ -46,7 +46,7 @@ int main() c_auto (csmap_istr, m1) c_auto (cvec_istr, v) { - c_emplace(csmap_istr, m1, { { 40, "Zr" }, { 45, "Rh" } }); + c_apply_pair(csmap_istr, emplace, &m1, {{40, "Zr"}, {45, "Rh"}}); puts("The starting map m1 is (key, value):"); print_collection_csmap_istr(m1); diff --git a/examples/csmap_insert.c b/examples/csmap_insert.c index 1bb47697..ede1e5f0 100644 --- a/examples/csmap_insert.c +++ b/examples/csmap_insert.c @@ -74,10 +74,10 @@ int main() c_foreach (e, cvec_ii, v) printf("(%d, %d) ", e.ref->first, e.ref->second); puts(""); - csmap_ii_emplace_items(&m2, v.data, cvec_ii_size(v)); + c_foreach (e, cvec_ii, v) csmap_ii_put(&m2, e.ref->first, e.ref->second); puts("The modified key and mapped values of m2 are:"); - c_foreach (e, cvec_ii, v) printf("(%d, %d) ", e.ref->first, e.ref->second); + c_foreach (e, csmap_ii, m2) printf("(%d, %d) ", e.ref->first, e.ref->second); puts("\n"); } @@ -99,7 +99,7 @@ int main() c_auto (csmap_ii, m4) { // Insert the elements from an initializer_list - c_emplace(csmap_ii, m4, { { 4, 44 }, { 2, 22 }, { 3, 33 }, { 1, 11 }, { 5, 55 } }); + c_apply_pair(csmap_ii, insert, &m4, { { 4, 44 }, { 2, 22 }, { 3, 33 }, { 1, 11 }, { 5, 55 } }); puts("After initializer_list insertion, m4 contains:"); print_ii(m4); puts(""); diff --git a/examples/csset_erase.c b/examples/csset_erase.c index c32bf70c..df9b3d54 100644 --- a/examples/csset_erase.c +++ b/examples/csset_erase.c @@ -7,7 +7,7 @@ int main() { c_auto (csset_int, set) { - c_emplace(csset_int, set, {30, 20, 80, 40, 60, 90, 10, 70, 50}); + c_apply(csset_int, insert, &set, {30, 20, 80, 40, 60, 90, 10, 70, 50}); c_foreach (k, csset_int, set) printf(" %d", *k.ref); puts(""); diff --git a/examples/inits.c b/examples/inits.c index 64d1e970..47d01dac 100644 --- a/examples/inits.c +++ b/examples/inits.c @@ -47,7 +47,7 @@ int main(void) // CVEC PRIORITY QUEUE cpque_f_make_heap(&floats); - c_emplace(cpque_f, floats, {40.0f, 20.0f, 50.0f, 30.0f, 10.0f}); + c_apply(cpque_f, push, &floats, {40.0f, 20.0f, 50.0f, 30.0f, 10.0f}); puts("\npop and show high priorites first:"); while (! cpque_f_empty(floats)) { @@ -73,7 +73,7 @@ int main(void) // CMAP CNT c_auto (cmap_cnt, countries) { - c_emplace(cmap_cnt, countries, { + c_apply_pair(cmap_cnt, emplace, &countries, { {"Norway", 100}, {"Denmark", 50}, {"Iceland", 10}, @@ -96,7 +96,7 @@ int main(void) // CVEC PAIR c_auto (cvec_ip, pairs1) { - c_emplace (cvec_ip, pairs1, {{5, 6}, {3, 4}, {1, 2}, {7, 8}}); + c_apply(cvec_ip, push_back, &pairs1, {{5, 6}, {3, 4}, {1, 2}, {7, 8}}); cvec_ip_sort(&pairs1); c_foreach (i, cvec_ip, pairs1) @@ -107,7 +107,7 @@ int main(void) // CLIST PAIR c_auto (clist_ip, pairs2) { - c_emplace(clist_ip, pairs2, {{5, 6}, {3, 4}, {1, 2}, {7, 8}}); + c_apply(clist_ip, push_back, &pairs2, {{5, 6}, {3, 4}, {1, 2}, {7, 8}}); clist_ip_sort(&pairs2); c_foreach (i, clist_ip, pairs2) diff --git a/examples/list.c b/examples/list.c index ab5c70e2..94ee091f 100644 --- a/examples/list.c +++ b/examples/list.c @@ -36,7 +36,7 @@ int main() { puts(""); clist_fx_clear(&list); - c_emplace(clist_fx, list, {10, 20, 30, 40, 30, 50}); + c_apply(clist_fx, push_back, &list, {10, 20, 30, 40, 30, 50}); c_foreach (i, clist_fx, list) printf(" %g", *i.ref); puts(""); diff --git a/examples/list_erase.c b/examples/list_erase.c index 9a3df2f6..db05fb42 100644 --- a/examples/list_erase.c +++ b/examples/list_erase.c @@ -9,7 +9,7 @@ int main () { c_autovar (clist_i L = clist_i_init(), clist_i_del(&L)) { - c_emplace(clist_i, L, {10, 20, 30, 40, 50}); + c_apply(clist_i, push_back, &L, {10, 20, 30, 40, 50}); // 10 20 30 40 50 clist_i_iter_t it = clist_i_begin(&L); // ^ clist_i_next(&it); diff --git a/examples/list_splice.c b/examples/list_splice.c index 997c1cc3..425a344a 100644 --- a/examples/list_splice.c +++ b/examples/list_splice.c @@ -17,8 +17,8 @@ int main () { c_auto (clist_i, list1, list2) { - c_emplace(clist_i, list1, {1, 2, 3, 4, 5}); - c_emplace(clist_i, list2, {10, 20, 30, 40, 50}); + c_apply(clist_i, push_back, &list1, {1, 2, 3, 4, 5}); + c_apply(clist_i, push_back, &list2, {10, 20, 30, 40, 50}); print_ilist("list1:", list1); print_ilist("list2:", list2); diff --git a/examples/phonebook.c b/examples/phonebook.c index b7d3faba..640aaec3 100644 --- a/examples/phonebook.c +++ b/examples/phonebook.c @@ -42,14 +42,14 @@ int main(int argc, char **argv) c_static_assert(sizeof argc == 4); c_auto (cset_str, names) { - c_emplace (cset_str, names, {"Hello", "Cool", "True"}); + c_apply(cset_str, emplace, &names, {"Hello", "Cool", "True"}); c_foreach (i, cset_str, names) printf("%s ", i.ref->str); puts(""); } bool erased; c_auto (cmap_str, phone_book) { - c_emplace (cmap_str, phone_book, { + c_apply_pair (cmap_str, emplace, &phone_book, { {"Lilia Friedman", "(892) 670-4739"}, {"Tariq Beltran", "(489) 600-7575"}, {"Laiba Juarez", "(303) 885-5692"}, diff --git a/examples/priority.c b/examples/priority.c index 8ca02409..03bd1a03 100644 --- a/examples/priority.c +++ b/examples/priority.c @@ -20,7 +20,7 @@ int main() { cpque_i_push(&heap, stc64_uniform(&rng, &dist)); // push some negative numbers too. - c_emplace(cpque_i, heap, {-231, -32, -873, -4, -343}); + c_apply(cpque_i, push, &heap, {-231, -32, -873, -4, -343}); c_forrange (N) cpque_i_push(&heap, stc64_uniform(&rng, &dist)); diff --git a/examples/words.c b/examples/words.c index 7ab6d026..87327d71 100644 --- a/examples/words.c +++ b/examples/words.c @@ -14,7 +14,7 @@ int main1() c_auto (cvec_str, words) c_auto (cmap_strn, word_map) { - c_emplace (cvec_str, words, { + c_apply(cvec_str, emplace_back, &words, { "this", "sentence", "is", "not", "a", "sentence", "this", "sentence", "is", "a", "hoax" }); diff --git a/include/stc/ccommon.h b/include/stc/ccommon.h index 69afb2bd..2a1bea72 100644 --- a/include/stc/ccommon.h +++ b/include/stc/ccommon.h @@ -156,12 +156,18 @@ STC_API uint64_t c_default_hash(const void *key, size_t len); *b = (n)*sizeof *b > (BYTES) ? c_new_n(type, n) : _c_b \ ; b; b != _c_b ? c_free(b) : (void)0, b = NULL) -#define c_var(CX, c, ...) \ - CX c = CX##_init(); c_emplace(CX, c, __VA_ARGS__) +#define c_apply(CX, method, cx, ...) do { \ + const CX##_rawvalue_t _c_arr[] = __VA_ARGS__; \ + CX* _c_cx = (cx); \ + for (size_t _c_i = 0; _c_i < c_arraylen(_c_arr); ++_c_i) \ + CX##_##method(_c_cx, _c_arr[_c_i]); \ +} while (0) -#define c_emplace(CX, cx, ...) do { \ +#define c_apply_pair(CX, method, cx, ...) do { \ const CX##_rawvalue_t _c_arr[] = __VA_ARGS__; \ - CX##_emplace_items(&(cx), _c_arr, c_arraylen(_c_arr)); \ + CX* _c_cx = (cx); \ + for (size_t _c_i = 0; _c_i < c_arraylen(_c_arr); ++_c_i) \ + CX##_##method(_c_cx, _c_arr[_c_i].first, _c_arr[_c_i].second); \ } while (0) #define c_del(CX, ...) do { \ diff --git a/include/stc/cdeq.h b/include/stc/cdeq.h index 5dec0f3c..41f8cea8 100644 --- a/include/stc/cdeq.h +++ b/include/stc/cdeq.h @@ -99,12 +99,6 @@ cx_memb(_shrink_to_fit)(Self *self) { cx_memb(_del)(self); *self = cx; } -STC_INLINE void -cx_memb(_emplace_items)(Self *self, const cx_rawvalue_t arr[], size_t n) { - for (size_t i = 0; i < n; ++i) - cx_memb(_push_back)(self, i_valfrom(arr[i])); -} - #ifndef i_queue STC_INLINE cx_value_t* cx_memb(_emplace_front)(Self* self, i_valraw raw) { diff --git a/include/stc/clist.h b/include/stc/clist.h index e123200f..7678b540 100644 --- a/include/stc/clist.h +++ b/include/stc/clist.h @@ -98,7 +98,6 @@ STC_API void cx_memb(_del)(Self* self); STC_API cx_value_t* cx_memb(_push_back)(Self* self, i_val value); STC_API cx_value_t* cx_memb(_push_front)(Self* self, i_val value); STC_API cx_iter_t cx_memb(_insert)(Self* self, cx_iter_t it, i_val value); -STC_API void cx_memb(_emplace_items)(Self *self, const cx_rawvalue_t arr[], size_t n); STC_API cx_iter_t cx_memb(_erase_at)(Self* self, cx_iter_t it); STC_API cx_iter_t cx_memb(_erase_range)(Self* self, cx_iter_t it1, cx_iter_t it2); STC_API size_t cx_memb(_remove)(Self* self, i_valraw val); @@ -209,11 +208,6 @@ cx_memb(_push_front)(Self* self, i_val value) { return &entry->value; } -STC_DEF void -cx_memb(_emplace_items)(Self *self, const cx_rawvalue_t arr[], size_t n) { - for (size_t i=0; ilast; diff --git a/include/stc/cmap.h b/include/stc/cmap.h index 763764b7..5a55c3df 100644 --- a/include/stc/cmap.h +++ b/include/stc/cmap.h @@ -152,12 +152,6 @@ cx_memb(_emplace)(Self* self, i_keyraw rkey cx_MAP_ONLY(, i_valraw rmapped)) { return _res; } -STC_INLINE void -cx_memb(_emplace_items)(Self* self, const cx_rawvalue_t arr[], size_t n) { - for (size_t i=0; idata + cvec_rep_(self)->size, arr, arr + n); -} - STC_INLINE cx_iter_t cx_memb(_erase)(Self* self, size_t idx) { return cx_memb(_erase_range_p)(self, self->data + idx, self->data + idx + 1); -- cgit v1.2.3