diff options
| author | Tyge Løvset <[email protected]> | 2021-09-23 09:11:27 +0200 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2021-09-23 09:11:27 +0200 |
| commit | 9058dd37ee3eda1dc004e07218cd8115e3fa4f09 (patch) | |
| tree | fd8cddba1a9d1ea3f8513575c0866000ab37da99 | |
| parent | caa64bd67527b68c159fd33130f43de65d3a18d1 (diff) | |
| download | STC-modified-9058dd37ee3eda1dc004e07218cd8115e3fa4f09.tar.gz STC-modified-9058dd37ee3eda1dc004e07218cd8115e3fa4f09.zip | |
Added sptr_ex.c example + minors.
| -rw-r--r-- | docs/csptr_api.md | 4 | ||||
| -rw-r--r-- | examples/sptr_ex.c | 65 | ||||
| -rw-r--r-- | include/stc/template.h | 4 |
3 files changed, 69 insertions, 4 deletions
diff --git a/docs/csptr_api.md b/docs/csptr_api.md index 5c15fae4..d1157162 100644 --- a/docs/csptr_api.md +++ b/docs/csptr_api.md @@ -76,8 +76,8 @@ void int_del(int* x) { #define i_key_csptr int // refer to csptr_int definition above #include <stc/csset.h> // define a sorted set of csptr_int -#define i_val_csptr int -#include <stc/cvec.h> // define a sorted vector of csptr_int +#define i_val_csptr int // refer to csptr_int definition above +#include <stc/cvec.h> // define a vector of csptr_int int main() { diff --git a/examples/sptr_ex.c b/examples/sptr_ex.c new file mode 100644 index 00000000..4a0397ec --- /dev/null +++ b/examples/sptr_ex.c @@ -0,0 +1,65 @@ +// shared_ptr-examples.cpp
+// based on https://docs.microsoft.com/en-us/cpp/cpp/how-to-create-and-use-shared-ptr-instances?view=msvc-160
+
+#include <stdio.h>
+#include <stc/cstr.h>
+#include <stc/forward.h>
+
+forward_csptr(song, struct Song);
+struct Test {
+ csptr_song song1;
+ csptr_song song2;
+};
+
+// ...
+
+struct Song
+{
+ cstr artist;
+ cstr title;
+} typedef Song;
+
+Song Song_from(const char* artist, const char* title)
+ { return (Song){cstr_from(artist), cstr_from(title)}; }
+
+void Song_del(Song* s) {
+ printf("del: %s\n", s->title.str);
+ c_del(cstr, &s->artist, &s->title);
+}
+
+#define i_val Song
+#define F_tag song
+#define i_cmp c_no_compare
+#define i_del Song_del
+#include <stc/csptr.h>
+
+#define i_val_csptr song
+#include <stc/cvec.h>
+
+void example3()
+{
+ c_auto (cvec_song, v, v2) {
+ csptr_song songs[] = {
+ csptr_song_make(Song_from("Bob Dylan", "The Times They Are A Changing")),
+ csptr_song_make(Song_from("Aretha Franklin", "Bridge Over Troubled Water")),
+ csptr_song_make(Song_from("Thalia", "Entre El Mar y Una Estrella"))
+ };
+ c_forrange (i, c_arraylen(songs))
+ cvec_song_push_back(&v, songs[i]);
+
+ c_foreach (s, cvec_song, v)
+ if (!cstr_equalto(s.ref->get->artist, "Bob Dylan"))
+ cvec_song_emplace_back(&v2, *s.ref); // calls csptr_song_clone()
+
+ cvec_song_push_back(&v2, csptr_song_make(Song_from("Pink Floyd", "Dogs")));
+
+ c_foreach (s, cvec_song, v2)
+ printf("%s - %s: refs %zu\n", s.ref->get->artist.str, s.ref->get->title.str,
+ *s.ref->use_count);
+ }
+}
+
+int main()
+{
+ example3();
+}
\ No newline at end of file diff --git a/include/stc/template.h b/include/stc/template.h index c207ae56..cc3e028f 100644 --- a/include/stc/template.h +++ b/include/stc/template.h @@ -139,8 +139,8 @@ #ifndef i_keydel
#define i_keydel c_default_del
#endif
-#elif defined i_keydel || defined i_keyfrom || defined i_keyraw || defined i_hash || defined i_equ
- #warning i_key-related definitions without i_key are ignored.
+#elif defined i_isset || defined i_keydel || defined i_keyfrom || defined i_keyraw || defined i_hash || defined i_equ
+ #error i_key define is missing.
#endif
#ifndef i_tag
|
