Last active
June 1, 2021 19:18
-
-
Save vendelin8/be56b25cf60c06e3b090c2483988e73c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Code generated by colf(1); DO NOT EDIT. | |
// The compiler used schema file demo.colf for package demo. | |
/// Package demo offers a demonstration. | |
/// These comment lines will end up in the generated code. | |
import 'dart:convert'; | |
import 'dart:typed_data'; | |
import 'package:collection/collection.dart'; | |
import 'package:quiver/core.dart'; | |
/// The upper limit for serial byte sizes. | |
const colferSizeMax = 16 * 1024 * 1024; | |
/// The upper limit for the number of elements in a list. | |
const colferListMax = 64 * 1024; | |
/// Course is the grounds where the game of golf is played. | |
class Course { | |
Course({ | |
this.iD = 0, | |
this.name = '', | |
List<Hole>? holes, | |
Uint8List? image, | |
List<String>? tags, | |
}) : holes = holes ?? [], | |
image = image ?? Uint8List(0), | |
tags = tags ?? []; | |
int iD; | |
String name; | |
List<Hole?> holes; | |
Uint8List image; | |
List<String> tags; | |
@override | |
bool operator ==(Object other) => | |
(other is Course) && | |
other.iD == iD && | |
other.name == name && | |
const IterableEquality().equals(other.holes, holes) && | |
const IterableEquality().equals(other.image, image) && | |
const IterableEquality().equals(other.tags, tags); | |
@override | |
String toString() => 'class Course {' | |
'iD: ${iD.toString()}' | |
', name: "$name"' | |
', holes: List<Hole>${holes.toString()}' | |
', image: ${image.toString()}' | |
', tags: [${tags.isNotEmpty ? "\"tags.join('\", \"')}" : ""}]'; | |
@override | |
int get hashCode => hashObjects([iD, name, holes, image, tags]); | |
/// Returns an over estimatation of marshal length. | |
/// | |
/// Throws [RangeError] if the size of a list exceeds [colferListMax]. | |
/// Returns an over estimated length for the required buffer. String | |
/// characters are counted for 4 bytes, everything has its exact size. | |
int marshalLen() { | |
int _l = 1; | |
{ | |
int _x = iD; | |
if (_x < 0 || 0x2000000000000 <= _x) { | |
_l += 9; | |
} else if (_x != 0) { | |
for (_l += 2; _x >= 0x80; _l++) { | |
_x >>= 7; | |
} | |
} | |
} | |
{ | |
int _x = name.length; | |
if (_x != 0) { | |
_x *= 4; | |
for (_l += _x + 2; _x >= 0x80; _l++) { | |
_x >>= 7; | |
} | |
} | |
} | |
{ | |
int _x = holes.length; | |
if (_x != 0) { | |
if (_x > colferListMax) { | |
throw RangeError.range(_x, null, colferListMax, 'demo.course.holes', 'colfer'); | |
} | |
for (_l += 2; _x >= 0x80; _l++) { | |
_x >>= 7; | |
} | |
for (final _v in holes) { | |
if (_v == null) { | |
_l++; | |
continue; | |
} | |
_l += _v.marshalLen(); | |
} | |
} | |
} | |
{ | |
int _x = image.length; | |
if (_x != 0) { | |
for (_l += _x + 2; _x >= 0x80; _l++) { | |
_x >>= 7; | |
} | |
} | |
} | |
{ | |
int _x = tags.length; | |
if (_x != 0) { | |
if (_x > colferListMax) { | |
throw RangeError.range(_x, null, colferListMax, 'demo.course.tags', 'colfer'); | |
} | |
for (_l += 2; _x >= 0x80; _l++) { | |
_x >>= 7; | |
} | |
for (final _a in tags) { | |
_x = _a.length; | |
_x *= 4; | |
for (_l += _x + 1; _x >= 0x80; _l++) { | |
_x >>= 7; | |
} | |
} | |
} | |
} | |
if (_l > colferSizeMax) { | |
return colferSizeMax; | |
} | |
return _l; | |
} | |
/// Encodes as Colfer into [_buf]. | |
/// | |
/// Throws [RangeError] if uint8, uint16, uint32 or int32 value overflows or | |
/// underflows, or when the size of a list exceeds [colferListMax], or if a | |
/// text, binary, or [_buf] exceeds [colferSizeMax]. Returns the number of | |
/// bytes written. | |
int marshalTo(Uint8List _buf) { | |
var _view = _buf.buffer.asByteData(); | |
int _i = 0; | |
{ | |
int _x = iD; | |
if (_x != 0) { | |
if (0 < _x && _x < 0x2000000000000) { | |
_buf[_i] = 0; | |
_i++; | |
while (_x > 127) { | |
_buf[_i] = (_x & 127) | 128; | |
_i++; | |
_x >>= 7; | |
} | |
_buf[_i] = _x; | |
_i++; | |
} else { | |
_buf[_i] = 0 | 128; | |
_view.setInt64(_i + 1, _x); | |
_i += 9; | |
} | |
} | |
} | |
{ | |
int _x = name.length; | |
if (_x > 0) { | |
_buf[_i] = 1; | |
_i++; | |
var _v = utf8.encode(name); | |
_x = _v.length; | |
while (_x > 127) { | |
_buf[_i] = (_x & 127) | 128; | |
_i++; | |
_x >>= 7; | |
} | |
_buf[_i] = _x; | |
_buf.setAll(_i + 1, _v); | |
_i += 1 + _v.length; | |
} | |
} | |
{ | |
int _x = holes.length; | |
if (_x > 0) { | |
if (_x > colferListMax) { | |
throw RangeError.range(_x, null, colferListMax, 'demo.course.holes', 'colfer'); | |
} | |
_buf[_i] = 2; | |
_i++; | |
while (_x > 127) { | |
_buf[_i] = (_x & 127) | 128; | |
_i++; | |
_x >>= 7; | |
} | |
_buf[_i] = _x; | |
_i++; | |
for (var _vi in holes) { | |
_vi ??= Hole(); | |
_i += _vi.marshalTo(Uint8List.view(_buf.buffer, _i)); | |
} | |
} | |
} | |
{ | |
int _x = image.length; | |
if (_x > 0) { | |
_buf[_i] = 3; | |
_i++; | |
var _v = image; | |
_x = _v.length; | |
while (_x > 127) { | |
_buf[_i] = (_x & 127) | 128; | |
_i++; | |
_x >>= 7; | |
} | |
_buf[_i] = _x; | |
_buf.setAll(_i + 1, _v); | |
_i += 1 + _v.length; | |
} | |
} | |
{ | |
int _x = tags.length; | |
if (_x > 0) { | |
if (_x > colferListMax) { | |
throw RangeError.range(_x, null, colferListMax, 'demo.course.tags', 'colfer'); | |
} | |
_buf[_i] = 4; | |
_i++; | |
while (_x > 127) { | |
_buf[_i] = (_x & 127) | 128; | |
_i++; | |
_x >>= 7; | |
} | |
_buf[_i] = _x; | |
_i++; | |
for (final _vi in tags) { | |
var _v = utf8.encode(_vi); | |
_x = _v.length; | |
while (_x > 127) { | |
_buf[_i] = (_x & 127) | 128; | |
_i++; | |
_x >>= 7; | |
} | |
_buf[_i] = _x; | |
_buf.setAll(_i + 1, _v); | |
_i += 1 + _v.length; | |
} | |
} | |
} | |
_buf[_i] = 127; | |
_i++; | |
if (_i > colferSizeMax) { | |
throw RangeError.range(_i, null, colferSizeMax, 'demo.course', 'colfer'); | |
} | |
return _i; | |
} | |
/// Decodes [_data] as Colfer. | |
/// | |
/// Throws [RangeError] if there is an unexpexted end of data, if a list | |
/// exceeds [colferListMax], or if a text, binary or [_data] exceeds | |
/// [colferSizeMax]. Throws [StateError] if ending header mismatches. | |
/// Returns the number of bytes read. | |
int unmarshal(Uint8List _data) { | |
int _header = 0; | |
int _i = 0; | |
var _view = ByteData.view(_data.buffer); | |
_header = _data[_i]; | |
_i++; | |
if (_header == 0) { | |
int _c = _data[_i]; | |
_i++; | |
if (_c >= 0x80) { | |
_c &= 0x7f; | |
for (int _shift = 7;; _shift += 7) { | |
int _b = _data[_i]; | |
_i++; | |
if (_b < 0x80 || _shift == 56) { | |
_c |= _b << _shift; | |
break; | |
} | |
_c |= (_b & 0x7f) << _shift; | |
} | |
} | |
iD = _c; | |
_header = _data[_i]; | |
_i++; | |
} else if (_header == (0 | 128)) { | |
int _v = _view.getUint32(_i) * 0x100000000; | |
_v += _view.getUint32(_i + 4); | |
iD = _v; | |
_header = _data[_i + 8]; | |
_i += 9; | |
} | |
if (_header == 1) { | |
int _size = _data[_i]; | |
_i++; | |
if (_size >= 0x80) { | |
_size &= 0x7f; | |
for (int _shift = 7;; _shift += 7) { | |
int _b = _data[_i]; | |
_i++; | |
if (_b < 0x80 || _shift == 56) { | |
_size |= _b << _shift; | |
break; | |
} | |
_size |= (_b & 0x7f) << _shift; | |
} | |
} | |
if (_size < 0 || _size > colferSizeMax) { | |
throw RangeError.range(_size, 0, colferSizeMax, 'demo.course.name', 'colfer'); | |
} | |
int _s = _i; | |
_i += _size; | |
name = utf8.decode(_data.sublist(_s, _i)); | |
_header = _data[_i]; | |
_i++; | |
} | |
if (_header == 2) { | |
int _c = _data[_i]; | |
_i++; | |
if (_c >= 0x80) { | |
_c &= 0x7f; | |
for (int _shift = 7;; _shift += 7) { | |
int _b = _data[_i]; | |
_i++; | |
if (_b < 0x80 || _shift == 56) { | |
_c |= _b << _shift; | |
break; | |
} | |
_c |= (_b & 0x7f) << _shift; | |
} | |
} | |
if (_c < 0 || _c > colferListMax) { | |
throw RangeError.range(_c, 0, colferListMax, 'demo.course.holes', 'colfer'); | |
} | |
if (holes.length != _c) { | |
holes = List<Hole>.filled(_c, Hole()); | |
} | |
for (var _ci in holes) { | |
_ci ??= Hole(); | |
_i += _ci.unmarshal(_data.sublist(_i)); | |
} | |
_header = _data[_i]; | |
_i++; | |
} | |
if (_header == 3) { | |
int _size = _data[_i]; | |
_i++; | |
if (_size >= 0x80) { | |
_size &= 0x7f; | |
for (int _shift = 7;; _shift += 7) { | |
int _b = _data[_i]; | |
_i++; | |
if (_b < 0x80 || _shift == 56) { | |
_size |= _b << _shift; | |
break; | |
} | |
_size |= (_b & 0x7f) << _shift; | |
} | |
} | |
if (_size < 0 || _size > colferSizeMax) { | |
throw RangeError.range(_size, 0, colferSizeMax, 'demo.course.image', 'colfer'); | |
} | |
int _start = _i; | |
_i += _size; | |
image = _data.sublist(_start, _i); | |
_header = _data[_i]; | |
_i++; | |
} | |
if (_header == 4) { | |
int _c = _data[_i]; | |
_i++; | |
if (_c >= 0x80) { | |
_c &= 0x7f; | |
for (int _shift = 7;; _shift += 7) { | |
int _b = _data[_i]; | |
_i++; | |
if (_b < 0x80 || _shift == 56) { | |
_c |= _b << _shift; | |
break; | |
} | |
_c |= (_b & 0x7f) << _shift; | |
} | |
} | |
if (_c < 0 || _c > colferListMax) { | |
throw RangeError.range(_c, 0, colferListMax, 'demo.course.tags', 'colfer'); | |
} | |
if (tags.length != _c) { | |
tags = List<String>.filled(_c, ''); | |
} | |
for (int _ci = 0; _ci < _c; _ci++) { | |
int _size = _data[_i]; | |
_i++; | |
if (_size >= 0x80) { | |
_size &= 0x7f; | |
for (int _shift = 7;; _shift += 7) { | |
int _b = _data[_i]; | |
_i++; | |
if (_b < 0x80 || _shift == 56) { | |
_size |= _b << _shift; | |
break; | |
} | |
_size |= (_b & 0x7f) << _shift; | |
} | |
} | |
if (_size < 0 || _size > colferSizeMax) { | |
throw RangeError.range(_size, 0, colferSizeMax, 'demo.course.tags', 'colfer'); | |
} | |
int _s = _i; | |
_i += _size; | |
tags[_ci] = utf8.decode(_data.sublist(_s, _i)); | |
} | |
_header = _data[_i]; | |
_i++; | |
} | |
if (_header != 127) { | |
throw StateError('colfer: unknown header $_header at byte ${_i - 1}'); | |
} | |
if (_i > colferSizeMax) { | |
throw RangeError.range(_i, null, colferSizeMax, 'demo.course', 'colfer'); | |
} | |
return _i; | |
} | |
} | |
class Hole { | |
Hole({ | |
this.lat = 0.0, | |
this.lon = 0.0, | |
this.par = 0, | |
this.water = false, | |
this.sand = false, | |
}); | |
/// Lat is the latitude of the cup. | |
double lat; | |
/// Lon is the longitude of the cup. | |
double lon; | |
/// Par is the difficulty index. | |
int par; | |
/// Water marks the presence of water. | |
bool water; | |
/// Sand marks the presence of sand. | |
bool sand; | |
@override | |
bool operator ==(Object other) => | |
(other is Hole) && | |
other.lat == lat && | |
other.lon == lon && | |
other.par == par && | |
other.water == water && | |
other.sand == sand; | |
@override | |
String toString() => 'class Hole {' | |
'lat: ${lat.toString()}' | |
', lon: ${lon.toString()}' | |
', par: ${par.toString()}' | |
', water: ${water.toString()}' | |
', sand: ${sand.toString()}'; | |
@override | |
int get hashCode => hashObjects([lat, lon, par, water, sand]); | |
/// Returns an over estimatation of marshal length. | |
/// | |
/// Throws [RangeError] if the size of a list exceeds [colferListMax]. | |
/// Returns an over estimated length for the required buffer. String | |
/// characters are counted for 4 bytes, everything has its exact size. | |
int marshalLen() { | |
int _l = 1; | |
{ | |
if (lat != 0) { | |
_l += 9; | |
} | |
} | |
{ | |
if (lon != 0) { | |
_l += 9; | |
} | |
} | |
{ | |
if (par != 0) { | |
_l += 2; | |
} | |
} | |
{ | |
if (water) { | |
_l++; | |
} | |
} | |
{ | |
if (sand) { | |
_l++; | |
} | |
} | |
if (_l > colferSizeMax) { | |
return colferSizeMax; | |
} | |
return _l; | |
} | |
/// Encodes as Colfer into [_buf]. | |
/// | |
/// Throws [RangeError] if uint8, uint16, uint32 or int32 value overflows or | |
/// underflows, or when the size of a list exceeds [colferListMax], or if a | |
/// text, binary, or [_buf] exceeds [colferSizeMax]. Returns the number of | |
/// bytes written. | |
int marshalTo(Uint8List _buf) { | |
var _view = _buf.buffer.asByteData(); | |
int _i = 0; | |
{ | |
if (lat != 0) { | |
_buf[_i] = 0; | |
if (lat.isNaN) { | |
_buf[_i + 1] = 0x7f; | |
_buf[_i + 2] = 0xf8; | |
_buf[_i + 8] = 1; | |
} else { | |
_view.setFloat64(_i + 1, lat); | |
} | |
_i += 9; | |
} | |
} | |
{ | |
if (lon != 0) { | |
_buf[_i] = 1; | |
if (lon.isNaN) { | |
_buf[_i + 1] = 0x7f; | |
_buf[_i + 2] = 0xf8; | |
_buf[_i + 8] = 1; | |
} else { | |
_view.setFloat64(_i + 1, lon); | |
} | |
_i += 9; | |
} | |
} | |
{ | |
if (par != 0) { | |
if (par > 255 || par < 0) { | |
throw RangeError.range(par, 0, 255, 'demo.hole.par', 'colfer'); | |
} | |
_buf[_i] = 2; | |
_buf[_i + 1] = par; | |
_i += 2; | |
} | |
} | |
{ | |
if (water) { | |
_buf[_i] = 3; | |
_i++; | |
} | |
} | |
{ | |
if (sand) { | |
_buf[_i] = 4; | |
_i++; | |
} | |
} | |
_buf[_i] = 127; | |
_i++; | |
if (_i > colferSizeMax) { | |
throw RangeError.range(_i, null, colferSizeMax, 'demo.hole', 'colfer'); | |
} | |
return _i; | |
} | |
/// Decodes [_data] as Colfer. | |
/// | |
/// Throws [RangeError] if there is an unexpexted end of data, if a list | |
/// exceeds [colferListMax], or if a text, binary or [_data] exceeds | |
/// [colferSizeMax]. Throws [StateError] if ending header mismatches. | |
/// Returns the number of bytes read. | |
int unmarshal(Uint8List _data) { | |
int _header = 0; | |
int _i = 0; | |
var _view = ByteData.view(_data.buffer); | |
_header = _data[_i]; | |
_i++; | |
if (_header == 0) { | |
lat = _view.getFloat64(_i); | |
_i += 8; | |
_header = _data[_i]; | |
_i++; | |
} | |
if (_header == 1) { | |
lon = _view.getFloat64(_i); | |
_i += 8; | |
_header = _data[_i]; | |
_i++; | |
} | |
if (_header == 2) { | |
par = _data[_i]; | |
_header = _data[_i + 1]; | |
_i += 2; | |
} | |
if (_header == 3) { | |
water = true; | |
_header = _data[_i]; | |
_i++; | |
} | |
if (_header == 4) { | |
sand = true; | |
_header = _data[_i]; | |
_i++; | |
} | |
if (_header != 127) { | |
throw StateError('colfer: unknown header $_header at byte ${_i - 1}'); | |
} | |
if (_i > colferSizeMax) { | |
throw RangeError.range(_i, null, colferSizeMax, 'demo.hole', 'colfer'); | |
} | |
return _i; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment