Skip to content

Commit 0885223

Browse files
authored
Merge pull request #3 from JuliaReinforcementLearning/add_append
Add append!
2 parents b40c98e + 42b936f commit 0885223

File tree

4 files changed

+66
-2
lines changed

4 files changed

+66
-2
lines changed

.github/workflows/ci.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ jobs:
1111
matrix:
1212
version:
1313
- '1.0'
14-
- '1.5'
14+
- '1'
1515
- 'nightly'
1616
os:
1717
- ubuntu-latest

Project.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "CircularArrayBuffers"
22
uuid = "9de3a189-e0c0-4e15-ba3b-b14b9fb0aec1"
33
authors = ["Jun Tian <[email protected]> and contributors"]
4-
version = "0.1.2"
4+
version = "0.1.3"
55

66
[compat]
77
julia = "1"

src/CircularArrayBuffers.jl

+36
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,42 @@ function Base.push!(cb::CircularArrayBuffer{T, N}, data) where {T,N}
7979
cb
8080
end
8181

82+
function Base.append!(cb::CircularArrayBuffer{T, N}, data) where {T,N}
83+
d, r = divrem(length(data) , cb.step_size)
84+
@assert r == 0
85+
if length(data) >= length(cb.buffer)
86+
cb.nframes = capacity(cb)
87+
cb.first = 1
88+
cb.buffer[:] .= @view data[end-length(cb.buffer)+1:end]
89+
else
90+
start_idx = (cb.first-1) * cb.step_size + length(cb) + 1
91+
end_idx = start_idx + length(data) - 1
92+
if start_idx > length(cb.buffer)
93+
start_idx -= length(cb.buffer)
94+
end_idx -= length(cb.buffer)
95+
end
96+
if end_idx > length(cb.buffer)
97+
n_first_part = length(cb.buffer)-start_idx+1
98+
n_second_part = length(data) - n_first_part
99+
cb.buffer[end-n_first_part+1:end] .= @view data[1:n_first_part]
100+
cb.buffer[1:n_second_part] .= @view data[end-n_second_part+1:end]
101+
else
102+
cb.buffer[start_idx:end_idx] .= data
103+
end
104+
105+
if cb.nframes + d > capacity(cb)
106+
cb.first += cb.nframes + d - capacity(cb)
107+
if cb.first > capacity(cb)
108+
cb.first -= capacity(cb)
109+
end
110+
cb.nframes = capacity(cb)
111+
else
112+
cb.nframes += d
113+
end
114+
end
115+
cb
116+
end
117+
82118
function Base.pop!(cb::CircularArrayBuffer{T, N}) where {T,N}
83119
if cb.nframes <= 0
84120
throw(ArgumentError("buffer must be non-empty"))

test/runtests.jl

+28
Original file line numberDiff line numberDiff line change
@@ -126,4 +126,32 @@ using Test
126126
@test x == 7 * ones(2,2)
127127
@test b == reshape([c for x in 5:6 for c in x * A], 2, 2, 2)
128128
end
129+
130+
@testset "append!" begin
131+
b = CircularArrayBuffer{Int}(2,3)
132+
append!(b, zeros(2))
133+
append!(b, 1:4)
134+
@test b == [
135+
0 1 3
136+
0 2 4
137+
]
138+
139+
140+
b = CircularArrayBuffer{Int}(2,3)
141+
for i in 1:5
142+
push!(b, fill(i, 2))
143+
end
144+
empty!(b)
145+
append!(b, 1:4)
146+
@test b == [
147+
1 3
148+
2 4
149+
]
150+
151+
append!(b, 5:8)
152+
@test b == [
153+
3 5 7
154+
4 6 8
155+
]
156+
end
129157
end

0 commit comments

Comments
 (0)