< Summary

Class:Itinero.Network.Storage.BitCoder
Assembly:Itinero
File(s):/home/runner/work/routing2/routing2/src/Itinero/Network/Storage/BitCoder.cs
Covered lines:327
Uncovered lines:31
Coverable lines:358
Total lines:468
Line coverage:91.3% (327 of 358)
Covered branches:73
Total branches:84
Branch coverage:86.9% (73 of 84)
Tag:224_14471318300

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
SetDynamicUInt32(...)100%8100%
SetDynamicUInt64(...)94.44%1891.15%
GetDynamicUInt32(...)90%10100%
GetDynamicUInt64(...)90%2095.58%
ToUnsigned(...)100%4100%
FromUnsigned(...)100%2100%
SetGuid(...)100%2100%
GetGuid(...)0%20%
SetDynamicInt32(...)100%1100%
GetDynamicInt32(...)50%2100%
ToUnsigned(...)50%453.84%
FromUnsigned(...)50%266.66%
SetDynamicInt64(...)100%1100%
GetDynamicInt64(...)100%1100%
SetDynamicUInt32Nullable(...)75%4100%
GetDynamicUInt32Nullable(...)100%2100%
SetFixed(...)100%2100%
GetFixed(...)100%2100%

File(s)

/home/runner/work/routing2/routing2/src/Itinero/Network/Storage/BitCoder.cs

#LineLine coverage
 1using System;
 2using Reminiscence.Arrays;
 3
 4namespace Itinero.Network.Storage;
 5
 6internal static class BitCoder
 7{
 8    private const byte Mask = 128 - 1;
 9
 10    public static long SetDynamicUInt32(this ArrayBase<byte> data, long i, uint value)
 327011    {
 327012        var d0 = (byte)(value & Mask);
 327013        value >>= 7;
 327014        if (value == 0)
 253515        {
 253516            data[i] = d0;
 253517            return 1;
 18        }
 19
 73520        d0 += 128;
 73521        var d1 = (byte)(value & Mask);
 73522        value >>= 7;
 73523        if (value == 0)
 68424        {
 68425            data[i] = d0;
 68426            data[i + 1] = d1;
 68427            return 2;
 28        }
 29
 5130        d1 += 128;
 5131        var d2 = (byte)(value & Mask);
 5132        value >>= 7;
 5133        if (value == 0)
 4934        {
 4935            data[i] = d0;
 4936            data[i + 1] = d1;
 4937            data[i + 2] = d2;
 4938            return 3;
 39        }
 40
 241        d2 += 128;
 242        var d3 = (byte)(value & Mask);
 243        value >>= 7;
 244        if (value == 0)
 145        {
 146            data[i] = d0;
 147            data[i + 1] = d1;
 148            data[i + 2] = d2;
 149            data[i + 3] = d3;
 150            return 4;
 51        }
 52
 153        d3 += 128;
 154        var d4 = (byte)(value & Mask);
 155        data[i] = d0;
 156        data[i + 1] = d1;
 157        data[i + 2] = d2;
 158        data[i + 3] = d3;
 159        data[i + 4] = d4;
 160        return 5;
 327061    }
 62
 63    public static long SetDynamicUInt64(this ArrayBase<byte> data, long i, ulong value)
 2464    {
 2465        var d0 = (byte)(value & Mask);
 2466        value >>= 7;
 2467        if (value == 0)
 468        {
 469            data[i] = d0;
 470            return 1;
 71        }
 72
 2073        d0 += 128;
 2074        var d1 = (byte)(value & Mask);
 2075        value >>= 7;
 2076        if (value == 0)
 177        {
 178            data[i] = d0;
 179            data[i + 1] = d1;
 180            return 2;
 81        }
 82
 1983        d1 += 128;
 1984        var d2 = (byte)(value & Mask);
 1985        value >>= 7;
 1986        if (value == 0)
 187        {
 188            data[i] = d0;
 189            data[i + 1] = d1;
 190            data[i + 2] = d2;
 191            return 3;
 92        }
 93
 1894        d2 += 128;
 1895        var d3 = (byte)(value & Mask);
 1896        value >>= 7;
 1897        if (value == 0)
 198        {
 199            data[i] = d0;
 1100            data[i + 1] = d1;
 1101            data[i + 2] = d2;
 1102            data[i + 3] = d3;
 1103            return 4;
 104        }
 105
 17106        d3 += 128;
 17107        var d4 = (byte)(value & Mask);
 17108        value >>= 7;
 17109        if (value == 0)
 1110        {
 1111            data[i] = d0;
 1112            data[i + 1] = d1;
 1113            data[i + 2] = d2;
 1114            data[i + 3] = d3;
 1115            data[i + 4] = d4;
 1116            return 5;
 117        }
 118
 16119        d4 += 128;
 16120        var d5 = (byte)(value & Mask);
 16121        value >>= 7;
 16122        if (value == 0)
 1123        {
 1124            data[i] = d0;
 1125            data[i + 1] = d1;
 1126            data[i + 2] = d2;
 1127            data[i + 3] = d3;
 1128            data[i + 4] = d4;
 1129            data[i + 5] = d5;
 1130            return 6;
 131        }
 132
 15133        d5 += 128;
 15134        var d6 = (byte)(value & Mask);
 15135        value >>= 7;
 15136        if (value == 0)
 1137        {
 1138            data[i] = d0;
 1139            data[i + 1] = d1;
 1140            data[i + 2] = d2;
 1141            data[i + 3] = d3;
 1142            data[i + 4] = d4;
 1143            data[i + 5] = d5;
 1144            data[i + 6] = d6;
 1145            return 7;
 146        }
 147
 14148        d6 += 128;
 14149        var d7 = (byte)(value & Mask);
 14150        value >>= 7;
 14151        if (value == 0)
 0152        {
 0153            data[i] = d0;
 0154            data[i + 1] = d1;
 0155            data[i + 2] = d2;
 0156            data[i + 3] = d3;
 0157            data[i + 4] = d4;
 0158            data[i + 5] = d5;
 0159            data[i + 6] = d6;
 0160            data[i + 7] = d7;
 0161            return 8;
 162        }
 163
 14164        d7 += 128;
 14165        var d8 = (byte)(value & Mask);
 14166        value >>= 7;
 14167        if (value == 0)
 13168        {
 13169            data[i] = d0;
 13170            data[i + 1] = d1;
 13171            data[i + 2] = d2;
 13172            data[i + 3] = d3;
 13173            data[i + 4] = d4;
 13174            data[i + 5] = d5;
 13175            data[i + 6] = d6;
 13176            data[i + 7] = d7;
 13177            data[i + 8] = d8;
 13178            return 9;
 179        }
 180
 1181        d8 += 128;
 1182        var d9 = (byte)(value & Mask);
 1183        data[i] = d0;
 1184        data[i + 1] = d1;
 1185        data[i + 2] = d2;
 1186        data[i + 3] = d3;
 1187        data[i + 4] = d4;
 1188        data[i + 5] = d5;
 1189        data[i + 6] = d6;
 1190        data[i + 7] = d7;
 1191        data[i + 8] = d8;
 1192        data[i + 9] = d9;
 1193        return 10;
 24194    }
 195
 196    public static long GetDynamicUInt32(this ArrayBase<byte> data, long i, out uint value)
 8186197    {
 8186198        if (i >= data.Length) throw new ArgumentOutOfRangeException(nameof(i));
 199
 8186200        var d = data[i];
 8186201        if (d < 128)
 7245202        {
 7245203            value = d;
 7245204            return 1;
 205        }
 206
 941207        value = (uint)d - 128;
 941208        d = data[i + 1];
 941209        if (d < 128)
 880210        {
 880211            value += (uint)d << 7;
 880212            return 2;
 213        }
 214
 61215        d -= 128;
 61216        value += (uint)d << 7;
 61217        d = data[i + 2];
 61218        if (d < 128)
 59219        {
 59220            value += (uint)d << 14;
 59221            return 3;
 222        }
 223
 2224        d -= 128;
 2225        value += (uint)d << 14;
 2226        d = data[i + 3];
 2227        if (d < 128)
 1228        {
 1229            value += (uint)d << 21;
 1230            return 4;
 231        }
 232
 1233        d -= 128;
 1234        value += (uint)d << 21;
 1235        d = data[i + 4];
 1236        value += (uint)d << 28;
 1237        return 5;
 8186238    }
 239
 240    public static long GetDynamicUInt64(this ArrayBase<byte> data, long i, out ulong value)
 2315241    {
 2315242        if (i >= data.Length) throw new ArgumentOutOfRangeException(nameof(i));
 243
 2315244        var d = data[i];
 2315245        if (d < 128)
 2294246        {
 2294247            value = d;
 2294248            return 1;
 249        }
 250
 21251        value = (ulong)d - 128;
 21252        d = data[i + 1];
 21253        if (d < 128)
 1254        {
 1255            value += (uint)d << 7;
 1256            return 2;
 257        }
 258
 20259        d -= 128;
 20260        value += (ulong)d << 7;
 20261        d = data[i + 2];
 20262        if (d < 128)
 1263        {
 1264            value += (uint)d << 14;
 1265            return 3;
 266        }
 267
 19268        d -= 128;
 19269        value += (ulong)d << 14;
 19270        d = data[i + 3];
 19271        if (d < 128)
 1272        {
 1273            value += (ulong)d << 21;
 1274            return 4;
 275        }
 276
 18277        d -= 128;
 18278        value += (ulong)d << 21;
 18279        d = data[i + 4];
 18280        if (d < 128)
 1281        {
 1282            value += (ulong)d << 28;
 1283            return 5;
 284        }
 285
 17286        d -= 128;
 17287        value += (ulong)d << 28;
 17288        d = data[i + 5];
 17289        if (d < 128)
 1290        {
 1291            value += (ulong)d << 35;
 1292            return 6;
 293        }
 294
 16295        d -= 128;
 16296        value += (ulong)d << 35;
 16297        d = data[i + 6];
 16298        if (d < 128)
 1299        {
 1300            value += (ulong)d << 42;
 1301            return 7;
 302        }
 303
 15304        d -= 128;
 15305        value += (ulong)d << 42;
 15306        d = data[i + 7];
 15307        if (d < 128)
 0308        {
 0309            value += (ulong)d << 49;
 0310            return 8;
 311        }
 312
 15313        d -= 128;
 15314        value += (ulong)d << 49;
 15315        d = data[i + 8];
 15316        if (d < 128)
 14317        {
 14318            value += (ulong)d << 56;
 14319            return 9;
 320        }
 321
 1322        d -= 128;
 1323        value += (ulong)d << 56;
 1324        d = data[i + 9];
 1325        value += (ulong)d << 63;
 1326        return 10;
 2315327    }
 328
 329    public static uint ToUnsigned(int value)
 727330    {
 727331        var unsigned = (uint)value;
 727332        if (value < 0)
 291333        {
 291334            unsigned = (uint)-value;
 291335        }
 336
 727337        unsigned <<= 1;
 727338        if (value < 0)
 291339        {
 291340            unsigned += 1;
 291341        }
 342
 727343        return unsigned;
 727344    }
 345
 346    public static int FromUnsigned(uint unsigned)
 956347    {
 956348        var sign = unsigned & (uint)1;
 349
 956350        var value = (int)(unsigned >> 1);
 956351        if (sign == 1)
 334352        {
 334353            value = -value;
 334354        }
 355
 956356        return value;
 956357    }
 358
 359    public static long SetGuid(this ArrayBase<byte> data, long i, Guid value)
 2360    {
 2361        var bytes = value.ToByteArray();
 68362        for (var b = 0; b < 16; b++)
 32363        {
 32364            data[i + b] = bytes[b];
 32365        }
 366
 2367        return 16;
 2368    }
 369
 370    public static long GetGuid(this ArrayBase<byte> data, long i, out Guid value)
 0371    {
 0372        var bytes = new byte[16];
 0373        for (var b = 0; b < 16; b++)
 0374        {
 0375            bytes[b] = data[i + b];
 0376        }
 377
 0378        value = new Guid(bytes);
 0379        return 16;
 0380    }
 381
 382    public static long SetDynamicInt32(this ArrayBase<byte> data, long i, int value)
 727383    {
 727384        return data.SetDynamicUInt32(i, ToUnsigned(value));
 727385    }
 386
 387    public static long GetDynamicInt32(this ArrayBase<byte> data, long i, out int value)
 956388    {
 956389        if (i >= data.Length) throw new ArgumentOutOfRangeException(nameof(i));
 390
 956391        var c = data.GetDynamicUInt32(i, out var unsigned);
 956392        value = FromUnsigned(unsigned);
 956393        return c;
 956394    }
 395
 396    public static ulong ToUnsigned(long value)
 2397    {
 2398        var unsigned = (ulong)value;
 2399        if (value < 0)
 0400        {
 0401            unsigned = (ulong)-value;
 0402        }
 403
 2404        unsigned <<= 1;
 2405        if (value < 0)
 0406        {
 0407            unsigned += 1;
 0408        }
 409
 2410        return unsigned;
 2411    }
 412
 413    public static long FromUnsigned(ulong unsigned)
 2414    {
 2415        var sign = unsigned & (ulong)1;
 416
 2417        var value = (long)(unsigned >> 1);
 2418        if (sign == 1)
 0419        {
 0420            value = -value;
 0421        }
 422
 2423        return value;
 2424    }
 425
 426    public static long SetDynamicInt64(this ArrayBase<byte> data, long i, long value)
 2427    {
 2428        return data.SetDynamicUInt64(i, ToUnsigned(value));
 2429    }
 430
 431    public static long GetDynamicInt64(this ArrayBase<byte> data, long i, out long value)
 2432    {
 2433        var c = data.GetDynamicUInt64(i, out var unsigned);
 2434        value = FromUnsigned(unsigned);
 2435        return c;
 2436    }
 437
 438    public static long SetDynamicUInt32Nullable(this ArrayBase<byte> data, long i, uint? value)
 570439    {
 570440        value = value == null ? 0 : value + 1;
 570441        return data.SetDynamicUInt32(i, value.Value);
 570442    }
 443
 444    public static long GetDynamicUInt32Nullable(this ArrayBase<byte> data, long i, out uint? value)
 2304445    {
 2304446        var c = data.GetDynamicUInt32(i, out var unsigned);
 2304447        value = unsigned == 0 ? null : (uint?)unsigned - 1;
 2304448        return c;
 2304449    }
 450
 451    public static void SetFixed(this ArrayBase<byte> data, long i, int bytes, int value)
 907452    {
 7180453        for (var b = 0; b < bytes; b++)
 2683454        {
 2683455            data[i + b] = (byte)(value & byte.MaxValue);
 2683456            value >>= 8;
 2683457        }
 907458    }
 459
 460    public static void GetFixed(this ArrayBase<byte> data, long i, int bytes, out int value)
 1410461    {
 1410462        value = 0;
 11186463        for (var b = 0; b < bytes; b++)
 4183464        {
 4183465            value += data[i + b] << (b * 8);
 4183466        }
 1410467    }
 468}