diff options
| author | Tyge Løvset <[email protected]> | 2021-12-12 21:33:22 +0100 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2021-12-12 21:33:22 +0100 |
| commit | d57b9bb7666753c7cf7ab5a0da6d7d11f303c2af (patch) | |
| tree | 258690df4a5ab62055261579967d6dfffaf5b0fd /examples/sharedptr.c | |
| parent | 9cd20ebfc4f1e10153ff814085499223265ef902 (diff) | |
| download | STC-modified-d57b9bb7666753c7cf7ab5a0da6d7d11f303c2af.tar.gz STC-modified-d57b9bb7666753c7cf7ab5a0da6d7d11f303c2af.zip | |
- Added **cbox** type: container of one element: similar to std::unique_ptr / Rust Box.
- Replaced example for **csptr** in docs.
- Added [**c_forpair**](docs/ccommon_api.md) macro: for-loop with "structural binding" as in c++.
- Deprecated *csptr_X_make()*. Renamed to *csptr_X_new()*. Corresponding **cbox** method is *cbox_X_new()*.
- Deprecated *c_default_fromraw(raw)*. Renamed to *c_default_clone(raw)*.
- Deprecated `i_key_csptr` / `i_val_csptr`. Use `i_key_ref` / `i_val_ref` when specifying containers with **csptr** or **cbox** elements.
- Deprecated `i_cnt`. Use `i_type` instead to define the full container type name.
- Bugfixes and docs updates.
Diffstat (limited to 'examples/sharedptr.c')
| -rw-r--r-- | examples/sharedptr.c | 55 |
1 files changed, 29 insertions, 26 deletions
diff --git a/examples/sharedptr.c b/examples/sharedptr.c index dbb3746f..a8e3e3ae 100644 --- a/examples/sharedptr.c +++ b/examples/sharedptr.c @@ -1,53 +1,56 @@ #include <stdio.h>
+#include <string.h>
-void int_del(int* x) { printf("del: %d\n", *x); }
+void int_del(int* x) {
+ printf("del: %d\n", *x);
+}
+// csptr implements its own clone method using ref counting, so 'i_valfrom'
+// should not be defined (ignored).
#define i_val int
-#define i_valdel int_del // optional func to show elements destroyed
-#include <stc/csptr.h> // csptr_int: shared pointer to int
+#define i_del int_del // optional func, just to display elements destroyed
+#include <stc/csptr.h> // csptr_int
-#define i_key_csptr csptr_int
-#define i_tag intp
-#include <stc/csset.h> // csset_intp: csset<csptr_int>
+#define i_key_ref csptr_int // note: use i_key_ref instead of i_key
+#define i_tag int // tag otherwise defaults to 'ref'
+#include <stc/csset.h> // csset_int (like: std::set<std::shared_ptr<int>>)
-#define i_val_csptr csptr_int
-#define i_tag intp
-#include <stc/cvec.h> // cvec_intp: cvec<csptr_int>
+#define i_val_ref csptr_int // Note: use i_val_ref instead of i_val
+#define i_tag int // tag otherwise defaults to 'ref'
+#include <stc/cvec.h> // cvec_int (like: std::vector<std::shared_ptr<int>>)
int main()
{
- c_auto (cvec_intp, vec)
- c_auto (csset_intp, set) // declare and init set, call del at scope exit
+ c_auto (cvec_int, vec) // declare and init vec, call del at scope exit
+ c_auto (csset_int, set) // declare and init set, call del at scope exit
{
- c_apply(cvec_intp, push_back, &vec, {
- csptr_int_make(2021),
- csptr_int_make(2012),
- csptr_int_make(2022),
- csptr_int_make(2015),
- });
+ const int years[] = {2021, 2012, 2022, 2015};
+ c_forrange (i, c_arraylen(years))
+ cvec_int_push_back(&vec, csptr_int_new(years[i]));
+
printf("vec:");
- c_foreach (i, cvec_intp, vec) printf(" %d", *i.ref->get);
+ c_foreach (i, cvec_int, vec) printf(" %d", *i.ref->get);
puts("");
// add odd numbers from vec to set
- c_foreach (i, cvec_intp, vec)
+ c_foreach (i, cvec_int, vec)
if (*i.ref->get & 1)
- csset_intp_emplace(&set, *i.ref); // copy shared pointer => increments counter.
+ csset_int_emplace(&set, *i.ref); // copy shared pointer => increments counter.
// erase the two last elements in vec
- cvec_intp_pop_back(&vec);
- cvec_intp_pop_back(&vec);
+ cvec_int_pop_back(&vec);
+ cvec_int_pop_back(&vec);
printf("vec:");
- c_foreach (i, cvec_intp, vec) printf(" %d", *i.ref->get);
+ c_foreach (i, cvec_int, vec) printf(" %d", *i.ref->get);
printf("\nset:");
- c_foreach (i, csset_intp, set) printf(" %d", *i.ref->get);
+ c_foreach (i, csset_int, set) printf(" %d", *i.ref->get);
c_autovar (csptr_int p = csptr_int_clone(vec.data[0]), csptr_int_del(&p)) {
- printf("\n%d is now owned by %lu objects\n", *p.get, *p.use_count);
+ printf("\n%d is now owned by %zu objects\n", *p.get, *p.use_count);
}
- puts("Done");
+ puts("\nDone");
}
}
|
