about summary refs log tree commit diff stats
path: root/src/css/selectorparser.nim
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2025-01-22 20:32:22 +0100
committerbptato <nincsnevem662@gmail.com>2025-01-22 20:32:22 +0100
commitf53a20f12bf07844402ece62c920c8dfbc6cb825 (patch)
tree043cdb4b1b43fa0e9d27a8212f8c8a330b5cf8f0 /src/css/selectorparser.nim
parent9df15b2b3c5a7897d2314c0b68a4faf05b8d7459 (diff)
downloadchawan-f53a20f12bf07844402ece62c920c8dfbc6cb825.tar.gz
Add annotations for move semantics
Supposedly they aren't broken in refc after 2.0.0, so we can do this now
that 1.6.14 is dropped.

I've confirmed lent to work as advertised; it indeed reduces copies.
sink doesn't seem to help much, but I guess it will be useful once we
switch to ORC.
Diffstat (limited to 'src/css/selectorparser.nim')
-rw-r--r--src/css/selectorparser.nim34
1 files changed, 18 insertions, 16 deletions
diff --git a/src/css/selectorparser.nim b/src/css/selectorparser.nim
index 70da9119..e1dffcea 100644
--- a/src/css/selectorparser.nim
+++ b/src/css/selectorparser.nim
@@ -45,11 +45,11 @@ type
     failed: bool
     nested: bool
 
-  RelationType* {.size: sizeof(int) div 2.} = enum
-    rtExists, rtEquals, rtToken, rtBeginDash,
-    rtStartsWith, rtEndsWith, rtContains
+  RelationType* = enum
+    rtExists, rtEquals, rtToken, rtBeginDash, rtStartsWith, rtEndsWith,
+    rtContains
 
-  RelationFlag* {.size: sizeof(int) div 2.} = enum
+  RelationFlag* = enum
     rfNone, rfI, rfS
 
   SelectorRelation* = object
@@ -111,28 +111,29 @@ proc parseSelectorList(cvals: seq[CSSComponentValue]; factory: CAtomFactory;
 proc parseComplexSelector(state: var SelectorParser): ComplexSelector
 func `$`*(cxsel: ComplexSelector): string
 
-iterator items*(sels: CompoundSelector): Selector {.inline.} =
-  for it in sels.sels:
+iterator items*(csel: CompoundSelector): lent Selector {.inline.} =
+  for it in csel.sels:
     yield it
 
-func `[]`*(sels: CompoundSelector; i: int): Selector {.inline.} =
-  return sels.sels[i]
+func `[]`*(csel: CompoundSelector; i: int): lent Selector {.inline.} =
+  return csel.sels[i]
 
-func `[]`*(sels: CompoundSelector; i: BackwardsIndex): Selector {.inline.} =
-  return sels.sels[i]
+func `[]`*(csel: CompoundSelector; i: BackwardsIndex): lent Selector
+    {.inline.} =
+  return csel[csel.sels.len - int(i)]
 
-func len*(sels: CompoundSelector): int {.inline.} =
-  return sels.sels.len
+func len*(csel: CompoundSelector): int {.inline.} =
+  return csel.sels.len
 
-proc add*(sels: var CompoundSelector; sel: Selector) {.inline.} =
-  sels.sels.add(sel)
+proc add*(csel: var CompoundSelector; sel: sink Selector) {.inline.} =
+  csel.sels.add(sel)
 
 func `[]`*(cxsel: ComplexSelector; i: int): lent CompoundSelector {.inline.} =
   return cxsel.csels[i]
 
-func `[]`*(cxsel: ComplexSelector; i: BackwardsIndex): CompoundSelector
+func `[]`*(cxsel: ComplexSelector; i: BackwardsIndex): lent CompoundSelector
     {.inline.} =
-  return cxsel.csels[i]
+  return cxsel[cxsel.csels.len - int(i)]
 
 func `[]`*(cxsel: var ComplexSelector; i: BackwardsIndex): var CompoundSelector
     {.inline.} =
@@ -209,6 +210,7 @@ func `$`*(sel: Selector): string =
     return "::" & $sel.elem
 
 func `$`*(sels: CompoundSelector): string =
+  result = ""
   for sel in sels:
     result &= $sel