1 /*******************************************************************************
2
3 Implementation of buffer version compatible with void[].
4
5 Copyright:
6 Copyright (c) 2016 dunnhumby Germany GmbH.
7 All rights reserved.
8
9 License:
10 Boost Software License Version 1.0. See LICENSE_BOOST.txt for details.
11 Alternatively, this file may be distributed under the terms of the Tango
12 3-Clause BSD License (see LICENSE_BSD.txt for details).
13
14 *******************************************************************************/
15
16 module ocean.core.buffer.Void;
17
18 template VoidBufferImpl ( )
19 {
20 /***************************************************************************
21
22 Plain D array internally used as buffer storage
23
24 ***************************************************************************/
25
26 private ubyte[] data;
27
28 /***************************************************************************
29
30 Assigns data to stored data from other slice
31
32 Params:
33 rhs = slice to assign from
34
35 ***************************************************************************/
36
37 void opAssign ( in void[] rhs )
38 {
39 this.length = rhs.length;
40 this.data[] = (cast(ubyte[]) rhs)[];
41 }
42
43 /***************************************************************************
44
45 Assigns data to stored data from other slice
46
47 Params:
48 rhs = slice to assign from
49 begin = starting index for local data
50 end = end index for local data
51
52 ***************************************************************************/
53
54 void opSliceAssign ( in void[] rhs, ptrdiff_t begin = 0,
55 ptrdiff_t end = -1 )
56 {
57 if (end < 0)
58 end = this.length();
59 this.data[begin .. end] = (cast(ubyte[]) rhs)[];
60 }
61
62 /***************************************************************************
63
64 Individual element access.
65
66 Params:
67 i = element index
68
69 Returns:
70 Requested element
71
72 ***************************************************************************/
73
74 ubyte* opIndex ( size_t i )
75 {
76 return &this.data[i];
77 }
78
79 /***************************************************************************
80
81 Invidual element assignment
82
83 Params:
84 value = new element value
85 i = element index
86
87 ***************************************************************************/
88
89 void opIndexAssign ( ubyte value, size_t i )
90 {
91 this.data[i] = value;
92 }
93
94 /***************************************************************************
95
96 Appends to current buffer
97
98 Params:
99 op = operation to perform
100 rhs = array or element to append
101
102 ***************************************************************************/
103
104 void opOpAssign (string op : "~") ( in ubyte rhs )
105 {
106 this.length = this.data.length + 1;
107 this.data[$-1] = rhs;
108 }
109
110 /***************************************************************************
111
112 ditto
113
114 ***************************************************************************/
115
116 void opOpAssign (string op: "~") ( in ubyte[] rhs )
117 {
118 this.length = this.data.length + rhs.length;
119 this.data[$-rhs.length .. $] = rhs[];
120 }
121
122 /***************************************************************************
123
124 Buffer element iteration
125
126 Params:
127 dg = foreach loop body
128
129 ***************************************************************************/
130
131 int opApply ( scope int delegate(ref const(ubyte)) dg ) const
132 {
133 foreach (elem; cast(ubyte[]) this.data)
134 {
135 auto status = dg(elem);
136 if (status != 0)
137 return status;
138 }
139
140 return 0;
141 }
142
143 /***************************************************************************
144
145 Buffer element iteration (with index)
146
147 Params:
148 dg = foreach loop body
149
150 ***************************************************************************/
151
152 int opApply ( scope int delegate(ref size_t, ref const(ubyte)) dg ) const
153 {
154 foreach (index, elem; cast(ubyte[]) this.data)
155 {
156 auto status = dg(index, elem);
157 if (status != 0)
158 return status;
159 }
160
161 return 0;
162 }
163 }