Minimalistic protocol buffer decoder and encoder in C++.
Designed for high performance. Suitable for writing zero copy parsers and encoders with minimal need for run-time allocation of memory.
Low-level: this is designed to be a building block for writing a very
customized decoder for a stable protobuf schema. If your protobuf schema is
changing frequently or lazy decoding is not critical for your application then
this approach offers no value: just use the C++ API that can be generated with
the Google Protobufs protoc
program.
The protozero code does not read .proto
files used by the usual Protobuf
implementations. The developer using protozero has to manually "translate" the
.proto
description into code. This means there is no way to access any of the
information from the .proto
description. This results in a few restrictions:
assert()
, but mostly the user has to take care of that.The library will make sure not to overrun the buffer it was given, but basically all other checks have to be made in user code!
You have to have a working knowledge of how protocol buffer encoding works.
The build process will also build the Doxygen-based reference documentation if
you have Doxygen installed. Then open doc/html/index.html
in your browser to
read it.
Protozero uses a very simplistic test to check the byte order of the system it compiles on. If this check is wrong, you'll get test failures. If this is the case, please open an issue and tell us about your system.
Extensive tests are included. Build them using CMake:
mkdir build
cd build
cmake ..
make
Call ctest
to run the tests.
The unit and reader tests are always build, the writer tests are only build if the Google Protobuf library is found when running CMake.
See test/README.md
for more details about the test.
To get a coverage report set CXXFLAGS
and LDFLAGS
before calling CMake:
CXXFLAGS="--coverage" LDFLAGS="--coverage" cmake ..
Then call make
as usual and run the tests using ctest
.
If you are using g++
use gcov
to generate a report (results are in *.gcov
files):
gcov -lp $(find test/ -name '*.o')
If you are using clang++
use llvm-cov
instead:
llvm-cov gcov -lp $(find test/ -name '*.o')
If you are using g++
you can use gcovr
to generate nice HTML output:
mkdir -p coverage
gcovr . -r SRCDIR --html --html-details -o coverage/index.html
Open coverage/index.html
in your browser to see the report.
After the CMake step, run
make clang-tidy
to check the code with clang-tidy.
You might have to set CLANG_TIDY
in CMake config.
For extra checks with Cppcheck you can, after the CMake step, call
make cppcheck
After the CMake step, call make install
to install the include files in
/usr/local/include/protozero
.
If you are using CMake to build your own software, you can copy the file
cmake/FindProtozero.cmake
and use it in your build. See the file for
details.
Are you using Protozero? Tell us! Send a pull request with changes to this README.