Packages
protox
0.24.0
2.0.9
2.0.8
2.0.7
2.0.6
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
2.0.0-dev
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
retired
1.7.3
1.7.2
1.7.1
1.7.0
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.4.0
1.3.2
1.3.1
1.3.0
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.1
1.1.0
1.0.0
0.25.0
0.24.0
0.23.1
0.23.0
0.22.0
0.21.0
0.20.0
0.19.1
0.19.0
0.18.0
0.17.0
0.16.2
0.16.1
0.16.0
0.15.2
0.15.1
0.15.0
0.14.0
0.13.0
0.12.1
0.12.0
0.11.1
0.11.0
0.10.0
0.9.1
0.9.0
0.8.0
0.7.1
0.7.0
A fast, easy to use and 100% conformant Elixir library for Google Protocol Buffers (aka protobuf)
Current section
Files
Jump to
Current section
Files
lib/protox/varint.ex
defmodule Protox.Varint do
@moduledoc false
use Bitwise
@spec encode(integer) :: iodata
def encode(v) when v < 128, do: <<v>>
def encode(v), do: [<<1::1, v::7>>, encode(v >>> 7)]
@spec decode(binary) :: {non_neg_integer, binary}
def decode(b), do: do_decode(0, 0, b)
# -- Private
@spec do_decode(non_neg_integer, non_neg_integer, binary) :: {non_neg_integer, binary}
defp do_decode(result, shift, <<0::1, byte::7, rest::binary>>) do
{result ||| byte <<< shift, rest}
end
defp do_decode(result, shift, <<1::1, byte::7, rest::binary>>) do
do_decode(
result ||| byte <<< shift,
shift + 7,
rest
)
end
defp do_decode(_result, _shift, binary) do
raise Protox.DecodingError.new(:varint, binary)
end
end