encode data as one or more segments and return the encoded data. The returned data does not include the terminator bit sequence.
(data []byte)
| 163 | // |
| 164 | // The returned data does not include the terminator bit sequence. |
| 165 | func (d *dataEncoder) encode(data []byte) (*bitset.Bitset, error) { |
| 166 | d.data = data |
| 167 | d.actual = nil |
| 168 | d.optimised = nil |
| 169 | |
| 170 | if len(data) == 0 { |
| 171 | return nil, errors.New("no data to encode") |
| 172 | } |
| 173 | |
| 174 | // Classify data into unoptimised segments. |
| 175 | highestRequiredMode := d.classifyDataModes() |
| 176 | |
| 177 | // Optimise segments. |
| 178 | err := d.optimiseDataModes() |
| 179 | if err != nil { |
| 180 | return nil, err |
| 181 | } |
| 182 | |
| 183 | // Check if a single byte encoded segment would be more efficient. |
| 184 | optimizedLength := 0 |
| 185 | for _, s := range d.optimised { |
| 186 | length, err := d.encodedLength(s.dataMode, len(s.data)) |
| 187 | if err != nil { |
| 188 | return nil, err |
| 189 | } |
| 190 | optimizedLength += length |
| 191 | } |
| 192 | |
| 193 | singleByteSegmentLength, err := d.encodedLength(highestRequiredMode, len(d.data)) |
| 194 | if err != nil { |
| 195 | return nil, err |
| 196 | } |
| 197 | |
| 198 | if singleByteSegmentLength <= optimizedLength { |
| 199 | d.optimised = []segment{segment{dataMode: highestRequiredMode, data: d.data}} |
| 200 | } |
| 201 | |
| 202 | // Encode data. |
| 203 | encoded := bitset.New() |
| 204 | for _, s := range d.optimised { |
| 205 | d.encodeDataRaw(s.data, s.dataMode, encoded) |
| 206 | } |
| 207 | |
| 208 | return encoded, nil |
| 209 | } |
| 210 | |
| 211 | // classifyDataModes classifies the raw data into unoptimised segments. |
| 212 | // e.g. "123ZZ#!#!" => |
no test coverage detected