summaryrefslogtreecommitdiffhomepage
path: root/include/stc/template.h
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2022-04-21 13:47:54 +0200
committerTyge Løvset <[email protected]>2022-04-21 13:47:54 +0200
commitd122c77b5a755cd5b3211c26346a84bb2b27cdce (patch)
treea66aba11b04670c84cca9034e7266014e2052e8f /include/stc/template.h
parent91385d449d03145cfe8cc91f2704d4b24c63d37e (diff)
downloadSTC-modified-d122c77b5a755cd5b3211c26346a84bb2b27cdce.tar.gz
STC-modified-d122c77b5a755cd5b3211c26346a84bb2b27cdce.zip
Switched to use i_key as primary template type parameter for all containers. Only maps will actually use i_val.
Users can still specify i_val for non-maps, so there are no usability changes, other than the option to use i_key always, which makes the implementation and switching between container types simpler.
Diffstat (limited to 'include/stc/template.h')
-rw-r--r--include/stc/template.h201
1 files changed, 106 insertions, 95 deletions
diff --git a/include/stc/template.h b/include/stc/template.h
index 8d8bd6dc..6f784c35 100644
--- a/include/stc/template.h
+++ b/include/stc/template.h
@@ -54,6 +54,41 @@
#include "cstr.h"
#endif
+#if !(defined i_key || defined i_key_str || defined i_key_bind || defined i_key_arcbox)
+ #define _i_key_from_val
+ #if defined _i_ismap
+ #error "i_key* must be defined for maps."
+ #endif
+
+ #if defined i_val_str
+ #define i_key_str i_val_str
+ #endif
+ #if defined i_val_arcbox
+ #define i_key_arcbox i_val_arcbox
+ #endif
+ #if defined i_val_bind
+ #define i_key_bind i_val_bind
+ #endif
+ #if defined i_val
+ #define i_key i_val
+ #endif
+ #if defined i_valraw
+ #define i_keyraw i_valraw
+ #endif
+ #if defined i_valclone
+ #define i_keyclone i_valclone
+ #endif
+ #if defined i_valfrom
+ #define i_keyfrom i_valfrom
+ #endif
+ #if defined i_valto
+ #define i_keyto i_valto
+ #endif
+ #if defined i_valdrop
+ #define i_keydrop i_valdrop
+ #endif
+#endif
+
#ifdef i_key_str
#define i_key_bind cstr
#define i_keyraw crawstr
@@ -63,6 +98,7 @@
#elif defined i_key_arcbox
#define i_key_bind i_key_arcbox
#define i_keyraw c_paste(i_key_arcbox, _value)
+ // smart pointers have special clone, so override:
#define i_keyclone c_paste(i_key_arcbox, _clone)
#define _i_no_emplace
#endif
@@ -81,21 +117,25 @@
#define i_keyto c_paste(i_key, _toraw)
#endif
#endif
+ #ifndef i_keydrop
+ #define i_keydrop c_paste(i_key, _drop)
+ #endif
#ifndef i_cmp
#define i_cmp c_paste(i_keyraw, _cmp)
#endif
- #ifndef i_eq
- #define i_eq c_paste(i_keyraw, _eq)
- #endif
- #ifndef i_hash
- #define i_hash c_paste(i_keyraw, _hash)
- #endif
- #ifndef i_keydrop
- #define i_keydrop c_paste(i_key, _drop)
+ #if defined _i_ishash
+ #ifndef i_eq
+ #define i_eq c_paste(i_keyraw, _eq)
+ #endif
+ #if !defined i_hash
+ #define i_hash c_paste(i_keyraw, _hash)
+ #endif
#endif
#endif
-#if defined i_keyraw && !defined i_keyfrom
+#if !defined i_key
+ #error "no i_key or i_val provided"
+#elif defined i_keyraw && !defined i_keyfrom
#error "if i_keyraw is defined, i_keyfrom (and normally i_keyto) must be defined"
#elif defined i_drop
#error "i_drop not supported. Define i_keydrop/i_valdrop instead."
@@ -103,12 +143,49 @@
#error "i_from not supported. Define i_keyfrom/i_valfrom instead."
#endif
+#ifndef i_tag
+ #define i_tag i_key
+#endif
+#if (!defined i_keyfrom && defined i_keydrop) || c_option(c_no_clone)
+ #define _i_no_clone
+#endif
+#if !defined i_hash && (defined i_keyfrom || defined i_keyclone || defined i_cmp || defined i_eq)
+ #define _i_no_hash
+#endif
+#ifndef i_keyfrom
+ #define i_keyfrom c_default_from
+#endif
+#ifndef i_keyraw
+ #define i_keyraw i_key
+#else
+ #define _i_has_raw
+#endif
+#ifndef i_keyto
+ #define i_keyto c_default_toraw
+#endif
+#ifndef i_keyclone
+ #define i_keyclone(key) i_keyfrom((i_keyto((&(key)))))
+#endif
+#ifndef i_keydrop
+ #define i_keydrop c_default_drop
+#endif
+#if !defined i_eq && defined i_cmp
+ #define i_eq(x, y) !(i_cmp(x, y))
+#elif !defined i_eq
+ #define i_eq c_default_eq
+#endif
+#ifndef i_cmp
+ #define i_cmp c_default_cmp
+#endif
+#ifndef i_hash
+ #define i_hash c_default_hash
+#endif
+
+#if defined _i_ismap // ---- process cmap/csmap value i_val, ... ----
+
#ifdef i_val_str
#define i_val_bind cstr
#define i_valraw crawstr
- #if !defined i_tag && !defined i_key
- #define i_tag str
- #endif
#elif defined i_val_arcbox
#define i_val_bind i_val_arcbox
#define i_valraw c_paste(i_val_arcbox, _value)
@@ -130,15 +207,6 @@
#define i_valto c_paste(i_val, _toraw)
#endif
#endif
- #if !defined i_cmp && !defined i_key
- #define i_cmp c_paste(i_valraw, _cmp)
- #endif
- #if !defined i_hash && c_option(c_hash)
- #define i_hash c_paste(i_val, _hash)
- #endif
- #if !defined i_eq && c_option(c_eq)
- #define i_eq c_paste(i_val, _eq)
- #endif
#ifndef i_valdrop
#define i_valdrop c_paste(i_val, _drop)
#endif
@@ -148,69 +216,7 @@
#error "if i_valraw is defined, i_valfrom (and normally i_valto) must be defined"
#endif
-#if !defined i_keyraw && !defined i_valraw
- #define _i_no_emplace
-#endif
-
-/* Copy i_val* macros to i_key* if _i_isset */
-#if defined _i_isset && defined i_val
- #if !defined i_key
- #define i_key i_val
- #endif
- #if defined i_valraw && !defined i_keyraw
- #define i_keyraw i_valraw
- #endif
- #if defined i_valclone && !defined i_keyclone
- #define i_keyclone i_valclone
- #endif
- #if defined i_valfrom && !defined i_keyfrom
- #define i_keyfrom i_valfrom
- #endif
- #if defined i_valto && !defined i_keyto
- #define i_keyto i_valto
- #endif
- #if defined i_valdrop && !defined i_keydrop
- #define i_keydrop i_valdrop
- #endif
-#endif
-
-#ifdef i_key
- #if defined _i_isset && !defined i_val
- #define i_val i_key
- #endif
- #ifndef i_tag
- #define i_tag i_key
- #endif
- #if !defined i_keyfrom && defined i_keydrop
- #define _i_no_clone
- #endif
- #if !defined i_hash && (defined i_keyfrom || defined i_cmp || defined i_eq)
- #define _i_no_hash 1
- #endif
- #if !defined i_cmp && !defined i_eq && defined i_hash
- #define _i_no_hash 2
- #endif
- #ifndef i_keyfrom
- #define i_keyfrom c_default_from
- #endif
- #ifndef i_keyraw
- #define i_keyraw i_key
- #endif
- #ifndef i_keyto
- #define i_keyto c_default_toraw
- #endif
- #ifndef i_keyclone
- #define i_keyclone(key) i_keyfrom((i_keyto((&(key)))))
- #endif
- #ifndef i_keydrop
- #define i_keydrop c_default_drop
- #endif
-#endif
-
-#ifndef i_tag
- #define i_tag i_val
-#endif
-#if (!defined i_valfrom && defined i_valdrop) || c_option(c_no_clone)
+#if !defined i_valfrom && defined i_valdrop
#define _i_no_clone
#endif
#ifndef i_valfrom
@@ -218,6 +224,8 @@
#endif
#ifndef i_valraw
#define i_valraw i_val
+#else
+ #define _i_has_raw
#endif
#ifndef i_valto
#define i_valto c_default_toraw
@@ -228,19 +236,20 @@
#ifndef i_valdrop
#define i_valdrop c_default_drop
#endif
-#if !defined i_eq && defined i_cmp
- #define i_eq(x, y) !(i_cmp(x, y))
-#elif !defined i_eq
- #define i_eq c_default_eq
+
+#endif // !_i_ismap
+
+#ifndef i_val
+ #define i_val i_key
#endif
-#ifndef i_cmp
- #define i_cmp c_default_cmp
+#ifndef i_valraw
+ #define i_valraw i_keyraw
#endif
-#ifndef i_hash
- #define i_hash c_default_hash
+#ifndef _i_has_raw
+ #define _i_no_emplace
#endif
-#else // -------------------------------------------------------
+#else // ============================================================
#undef i_type
#undef i_tag
@@ -256,22 +265,24 @@
#undef i_val_arcbox
#undef i_val_bind
#undef i_valraw
+#undef i_valclone
#undef i_valfrom
#undef i_valto
#undef i_valdrop
-#undef i_valclone
#undef i_key
#undef i_key_str
#undef i_key_arcbox
#undef i_key_bind
#undef i_keyraw
+#undef i_keyclone
#undef i_keyfrom
#undef i_keyto
#undef i_keydrop
-#undef i_keyclone
#undef _i_prefix
+#undef _i_has_raw
+#undef _i_key_from_val
#undef _i_no_clone
#undef _i_no_emplace
#undef _i_no_hash