Skip to content

Commit

Permalink
add cpp prefix to vector for consistency
Browse files Browse the repository at this point in the history
  • Loading branch information
Clonkk committed Apr 2, 2021
1 parent 5b23fae commit 6295ca4
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 77 deletions.
116 changes: 58 additions & 58 deletions cppstl/vector.nim
Original file line number Diff line number Diff line change
Expand Up @@ -13,116 +13,116 @@ when not defined(cpp):

{.push header: "<vector>".}
type
Vector*[T] {.importcpp: "std::vector".} = object
VectorIterator*[T] {.importcpp: "std::vector<'0>::iterator".} = object
VectorConstIterator*[T] {.importcpp: "std::vector<'0>::const_iterator".} = object
CppVector*[T] {.importcpp: "std::vector".} = object
CppVectorIterator*[T] {.importcpp: "std::vector<'0>::iterator".} = object
CppVectorConstIterator*[T] {.importcpp: "std::vector<'0>::const_iterator".} = object

# Constructors
proc initVector*[T](): Vector[T] {.importcpp: "std::vector<'*0>(@)".}
proc initVector*[T](n: csize_t): Vector[T] {.importcpp: "std::vector<'*0>(@)".}
proc initVector*[T](n: csize_t, val: T): Vector[T] {.importcpp: "std::vector<'*0>(@)".}
proc initVector*[T](x: Vector[T]): Vector[T] {.importcpp: "std::vector<'*0>(@)".}
proc initVector*[T](first, last: VectorConstIterator[T]): Vector[T] {.importcpp: "std::vector<'*0>(@)".}
proc initCppVector*[T](): CppVector[T] {.importcpp: "std::vector<'*0>(@)".}
proc initCppVector*[T](n: csize_t): CppVector[T] {.importcpp: "std::vector<'*0>(@)".}
proc initCppVector*[T](n: csize_t, val: T): CppVector[T] {.importcpp: "std::vector<'*0>(@)".}
proc initCppVector*[T](x: CppVector[T]): CppVector[T] {.importcpp: "std::vector<'*0>(@)".}
proc initCppVector*[T](first, last: CppVectorConstIterator[T]): CppVector[T] {.importcpp: "std::vector<'*0>(@)".}

# Iterators
proc begin*[T](x: Vector[T]): VectorIterator[T] {.importcpp: "begin".}
proc `end`*[T](x: Vector[T]): VectorIterator[T] {.importcpp: "end".}
proc begin*[T](x: CppVector[T]): CppVectorIterator[T] {.importcpp: "begin".}
proc `end`*[T](x: CppVector[T]): CppVectorIterator[T] {.importcpp: "end".}

proc rbegin*[T](x: Vector[T]): VectorIterator[T] {.importcpp: "rbegin".}
proc rend*[T](x: Vector[T]): VectorIterator[T] {.importcpp: "rend".}
proc rbegin*[T](x: CppVector[T]): CppVectorIterator[T] {.importcpp: "rbegin".}
proc rend*[T](x: CppVector[T]): CppVectorIterator[T] {.importcpp: "rend".}

proc cbegin*[T](x: Vector[T]): VectorConstIterator[T] {.importcpp: "cbegin".}
proc cend*[T](x: Vector[T]): VectorConstIterator[T] {.importcpp: "cend".}
proc cbegin*[T](x: CppVector[T]): CppVectorConstIterator[T] {.importcpp: "cbegin".}
proc cend*[T](x: CppVector[T]): CppVectorConstIterator[T] {.importcpp: "cend".}

proc crbegin*[T](x: Vector[T]): VectorConstIterator[T] {.importcpp: "crbegin".}
proc crend*[T](x: Vector[T]): VectorConstIterator[T] {.importcpp: "crend".}
proc crbegin*[T](x: CppVector[T]): CppVectorConstIterator[T] {.importcpp: "crbegin".}
proc crend*[T](x: CppVector[T]): CppVectorConstIterator[T] {.importcpp: "crend".}

# Capacity
proc size*[T](self: Vector[T]): csize_t {.importcpp: "size".}
proc max_size*[T](self: Vector[T]): csize_t {.importcpp: "max_size".}
proc resize*[T](self: Vector[T], n: csize_t) {.importcpp: "resize".}
proc capacity*[T](self: Vector[T]): csize_t {.importcpp: "capacity".}
proc empty*[T](self: Vector[T]): bool {.importcpp: "empty".}
proc reserve*[T](self: var Vector[T], n: csize_t) {.importcpp: "reserve".}
proc shrink_to_fit*[T](self: var Vector[T]) {.importcpp: "shrink_to_fit".}
proc size*[T](self: CppVector[T]): csize_t {.importcpp: "size".}
proc max_size*[T](self: CppVector[T]): csize_t {.importcpp: "max_size".}
proc resize*[T](self: CppVector[T], n: csize_t) {.importcpp: "resize".}
proc capacity*[T](self: CppVector[T]): csize_t {.importcpp: "capacity".}
proc empty*[T](self: CppVector[T]): bool {.importcpp: "empty".}
proc reserve*[T](self: var CppVector[T], n: csize_t) {.importcpp: "reserve".}
proc shrink_to_fit*[T](self: var CppVector[T]) {.importcpp: "shrink_to_fit".}

# Internal utility functions
proc unsafeIndex[T](self: var Vector[T], i: csize_t): var T {.importcpp: "#[#]".}
proc unsafeIndex[T](self: Vector[T], i: csize_t): T {.importcpp: "#[#]".}
proc unsafeIndex[T](self: var CppVector[T], i: csize_t): var T {.importcpp: "#[#]".}
proc unsafeIndex[T](self: CppVector[T], i: csize_t): T {.importcpp: "#[#]".}

proc at*[T](self: var Vector[T], n: csize_t): var T {.importcpp: "at".}
proc at*[T](self: Vector[T], n: csize_t): T {.importcpp: "at".}
proc at*[T](self: var CppVector[T], n: csize_t): var T {.importcpp: "at".}
proc at*[T](self: CppVector[T], n: csize_t): T {.importcpp: "at".}

proc front*[T](self: Vector[T]): T {.importcpp: "front".}
proc front*[T](self: var Vector[T]): var T {.importcpp: "front".}
proc front*[T](self: CppVector[T]): T {.importcpp: "front".}
proc front*[T](self: var CppVector[T]): var T {.importcpp: "front".}

proc back*[T](self: Vector[T]): T {.importcpp: "back".}
proc back*[T](self: var Vector[T]): var T {.importcpp: "back".}
proc back*[T](self: CppVector[T]): T {.importcpp: "back".}
proc back*[T](self: var CppVector[T]): var T {.importcpp: "back".}

proc data*[T](self: Vector[T]): ptr T {.importcpp: "data".}
proc data*[T](self: CppVector[T]): ptr T {.importcpp: "data".}

# Modifiers
proc assign*[T](n: csize_t, val: T) {.importcpp: "assign".}
proc assign*[T](first: VectorIterator[T], last: VectorIterator[T]) {.importcpp: "assign".}
proc assign*[T](first: CppVectorIterator[T], last: CppVectorIterator[T]) {.importcpp: "assign".}

proc push_back*[T](self: var Vector[T], x: T) {.importcpp: "push_back".}
proc push_back*[T](self: var CppVector[T], x: T) {.importcpp: "push_back".}

proc pop_back*[T](self: var Vector[T]) {.importcpp: "pop_back".}
proc pop_back*[T](self: var CppVector[T]) {.importcpp: "pop_back".}

proc insert*[T](self: var Vector[T], position: VectorConstIterator[T], x: T): VectorIterator[T] {.importcpp: "insert".}
proc insert*[T](self: var Vector[T], position: VectorConstIterator[T], n: csize_t, x: T): VectorIterator[T] {.importcpp: "insert".}
proc insert*[T](self: var Vector[T], position, first, last: VectorConstIterator[T]): VectorIterator[T] {.importcpp: "insert".}
proc insert*[T](self: var CppVector[T], position: CppVectorConstIterator[T], x: T): CppVectorIterator[T] {.importcpp: "insert".}
proc insert*[T](self: var CppVector[T], position: CppVectorConstIterator[T], n: csize_t, x: T): CppVectorIterator[T] {.importcpp: "insert".}
proc insert*[T](self: var CppVector[T], position, first, last: CppVectorConstIterator[T]): CppVectorIterator[T] {.importcpp: "insert".}

proc erase*[T](self: var Vector[T], position: VectorConstIterator[T]): VectorIterator[T] {.importcpp: "erase".}
proc erase*[T](self: var Vector[T], first, last: VectorConstIterator[T]): VectorIterator[T] {.importcpp: "erase".}
proc erase*[T](self: var CppVector[T], position: CppVectorConstIterator[T]): CppVectorIterator[T] {.importcpp: "erase".}
proc erase*[T](self: var CppVector[T], first, last: CppVectorConstIterator[T]): CppVectorIterator[T] {.importcpp: "erase".}

proc swap*[T](self: var Vector[T], x: var Vector[T]) {.importcpp: "swap".}
proc swap*[T](self: var CppVector[T], x: var CppVector[T]) {.importcpp: "swap".}

proc clear*[T](self: var Vector[T]) {.importcpp: "clear".}
proc clear*[T](self: var CppVector[T]) {.importcpp: "clear".}

# Relational operators
proc `==`*[T](a: Vector[T], b: Vector[T]): bool {.importcpp: "# == #".}
proc `==`*[T](a: CppVector[T], b: CppVector[T]): bool {.importcpp: "# == #".}

proc `!=`*[T](a: Vector[T], b: Vector[T]): bool {.importcpp: "# != #".}
proc `!=`*[T](a: CppVector[T], b: CppVector[T]): bool {.importcpp: "# != #".}

proc `<`*[T](a: Vector[T], b: Vector[T]): bool {.importcpp: "# < #".}
proc `<`*[T](a: CppVector[T], b: CppVector[T]): bool {.importcpp: "# < #".}

proc `<=`*[T](a: Vector[T], b: Vector[T]): bool {.importcpp: "# <= #".}
proc `<=`*[T](a: CppVector[T], b: CppVector[T]): bool {.importcpp: "# <= #".}

proc `>`*[T](a: Vector[T], b: Vector[T]): bool {.importcpp: "# > #".}
proc `>`*[T](a: CppVector[T], b: CppVector[T]): bool {.importcpp: "# > #".}

proc `>=`*[T](a: Vector[T], b: Vector[T]): bool {.importcpp: "# >= #".}
proc `>=`*[T](a: CppVector[T], b: CppVector[T]): bool {.importcpp: "# >= #".}

{.pop.}

# Nim specifics
proc checkIndex[T](self: Vector[T], i: csize_t) {.inline.} =
proc checkIndex[T](self: CppVector[T], i: csize_t) {.inline.} =
if i >= self.size:
raise newException(IndexDefect, &"index out of bounds: (i:{i}) <= (n:{self.size})")

# Element access
proc `[]`*[T](self: Vector[T], idx: Natural): T {.inline.} =
proc `[]`*[T](self: CppVector[T], idx: Natural): T {.inline.} =
let i = csize_t(idx)
when compileOption("boundChecks"): self.checkIndex(i)
self.unsafeIndex(i)

proc `[]`*[T](self: var Vector[T], idx: Natural): var T {.inline.} =
proc `[]`*[T](self: var CppVector[T], idx: Natural): var T {.inline.} =
let i = csize_t(idx)
when compileOption("boundChecks"): self.checkIndex(i)
# this strange syntax is to avoid a bug in the Nim c++ code generator
(addr self.unsafeIndex(i))[]

proc `[]=`*[T](self: var Vector[T], idx: Natural, val: T) {.inline.} =
proc `[]=`*[T](self: var CppVector[T], idx: Natural, val: T) {.inline.} =
let i = csize_t(idx)
when compileOption("boundChecks"): self.checkIndex(i)
self.unsafeIndex(i) = val

# Converter: VectorIterator -> VectorConstIterator
converter VectorIteratorToVectorConstIterator*[T](x: VectorIterator[T]):
VectorConstIterator[T] {.importcpp: "#".}
# Converter: CppVectorIterator -> CppVectorConstIterator
converter CppVectorIteratorToCppVectorConstIterator*[T](x: CppVectorIterator[T]):
CppVectorConstIterator[T] {.importcpp: "#".}

# Display the content of a vector
proc `$`*[T](v: Vector[T]): string {.noinit.} =
proc `$`*[T](v: CppVector[T]): string {.noinit.} =
if v.empty:
result = "[]"
else:
Expand All @@ -132,5 +132,5 @@ proc `$`*[T](v: Vector[T]): string {.noinit.} =
result = result & $v[v.size-1] & "]"

# Iterators arithmetics
iteratorsArithmetics(VectorIterator)
iteratorsArithmetics(VectorConstIterator)
iteratorsArithmetics(CppVectorIterator)
iteratorsArithmetics(CppVectorConstIterator)
38 changes: 19 additions & 19 deletions tests/tvector.nim
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,23 @@
# This code is licensed under MIT license (see LICENSE.txt for details)
import unittest, cppstl/vector

suite "Vector":
suite "CppVector":
test "constructors and iterators":
var v = initVector[int](3)
var v = initCppVector[int](3)

check v.size == 3
check v[0] == 0
check v[1] == 0
check v[2] == 0

v = initVector[int](3, 1)
v = initCppVector[int](3, 1)

check v.size == 3
check v[0] == 1
check v[1] == 1
check v[2] == 1

v = initVector[int]()
v = initCppVector[int]()
v.push_back(1)
v.push_back(2)
v.push_back(3)
Expand All @@ -29,38 +29,38 @@ suite "Vector":
check v[1] == 2
check v[2] == 3

var v2 = initVector(v)
var v2 = initCppVector(v)

check v.size == v2.size
check v[0] == v2[0]
check v[1] == v2[1]
check v[2] == v2[2]

v2 = initVector(begin(v), `end`(v))
v2 = initCppVector(begin(v), `end`(v))

check v.size == v2.size
check v[0] == v2[0]
check v[1] == v2[1]
check v[2] == v2[2]
check v == v2

v2 = initVector(rbegin(v), rend(v))
v2 = initCppVector(rbegin(v), rend(v))

check v.size == v2.size
check v[0] == v2[2]
check v[1] == v2[1]
check v[2] == v2[0]
check v != v2

v2 = initVector(cbegin(v), cend(v))
v2 = initCppVector(cbegin(v), cend(v))

check v.size == v2.size
check v[0] == v2[0]
check v[1] == v2[1]
check v[2] == v2[2]
check v == v2

v2 = initVector(crbegin(v), crend(v))
v2 = initCppVector(crbegin(v), crend(v))

check v.size == v2.size
check v[0] == v2[2]
Expand All @@ -69,7 +69,7 @@ suite "Vector":
check v != v2

test "capacity":
var v = initVector[int](3)
var v = initCppVector[int](3)

check v.size == 3
check v.capacity >= v.size
Expand All @@ -92,7 +92,7 @@ suite "Vector":
check v.size == v.capacity

test "element access":
var v = initVector[int](3)
var v = initCppVector[int](3)

check v[0] == 0
check v.at(0) == 0
Expand All @@ -113,14 +113,14 @@ suite "Vector":
expect(OutOfRangeException):
discard v.at(4)

v = initVector[int](5)
v = initCppVector[int](5)
for i in 0..<v.size:
v[i] = i.int

check v.front == 0
check v.back == 4

v = initVector[int](2)
v = initCppVector[int](2)
v.front() = 10
v.back() = 11

Expand All @@ -133,7 +133,7 @@ suite "Vector":
check cast[ptr int](cast[int](pdata)+1*sizeof(int))[] == 11

test "modifiers":
var v = initVector[int]()
var v = initCppVector[int]()
for i in 0..<3:
v.push_back i

Expand Down Expand Up @@ -203,8 +203,8 @@ suite "Vector":
check v.size == 1
check v[0] == 2

v = initVector[int](3, 1)
var v1 = initVector[int](3, 2)
v = initCppVector[int](3, 1)
var v1 = initCppVector[int](3, 2)

for i in 0..<3:
check v[i] == 1
Expand All @@ -222,8 +222,8 @@ suite "Vector":
check v.empty

test "relational operators":
let foo = initVector[int](3, 100)
let bar = initVector[int](2, 200)
let foo = initCppVector[int](3, 100)
let bar = initCppVector[int](2, 200)

check foo == foo
check foo <= foo
Expand All @@ -235,7 +235,7 @@ suite "Vector":
check foo <= bar

test "display":
var v = initVector[int]()
var v = initCppVector[int]()

check $v == "[]"

Expand Down

0 comments on commit 6295ca4

Please sign in to comment.