A header only C++ library that provides type safety and user defined literals for physical units

Overview

Continous Integration Appveyor Build Status Codacy Badge Language grade: C/C++ Continous Benchmark API Documentation

GitHub Releases GitHub license

SI - Type safety for physical units

A header only c++ library that provides type safety and user defined literals for handling pyhsical values defined in the International System of Units regulated by the International Bureau of Weights and Measures (BIPM) and published in the SI brochure. For a quick start see the installation guide. Contributions and comments are welcome, please check the contribution guidelines for further information.

An illustrative example:

#include <SI/electric_charge.h>
#include <SI/mass.h>

using namespace SI::literals;

constexpr auto one_kilogramm = 1.0_kg;
constexpr auto ten_coulomb = 5.0_A * 2.0_s;
constexpr auto half_an_ampere = ten_coulomb / 20.0_s;

void calculate_mass(const SI::kilo_gram_t<long double> &kg) {
  // do something meaningful here
}

int main(int, char **) {
  calculate_mass(one_kilogramm);
  return 0;
}

SI provides conversions and arithmetic operations with values of any of the International System of Units with strong type safety at compile time. All units are special typedefs of the template struct SI::unit_t. Only the value of the unit is stored internally, the ratio (i.e. milli, micro, kilo...) is determined as a type trait to allow all units to have the same resolution across the whole implemented ratios. SI handles operations of units of the same ratios as well as when the ratios are different. See the documentation implementation details for further information. Operations between units of the same ratio are overhead-free, else there is additional computation cost to adjust the values to the units. By passing the flag SI_DISABLE_IMPLICIT_RATIO_CONVERSION to the compiler implicit ratio conversion is not done and fails with a compiler error. See the continuous benchmark results for a comparison between the reference measurements and the implementation in SI.

It is possible to supply custom ratios to the built-in types and they are fully compatible for calculation with other units. However, the necessary literals or typedefs have to be supplied by the user. For instance SI::velocity_t<double, std::ratio<1000, 36>> would be "kilometre per one-hundreth-of-an-hour".

SI Base units

For each unit the available literals are the implemented ratios prefixed with an underscore. i.e. _mm. _km. Generally the ratios follow metric prefixes of the international system of units The typedefs are prefixed (or in rare cases interfixed) with the standard metric prefixes. i.e. metre_t, milli_metre_t, kilo_metre_t. The prefix or interfix is marked with an * in the tables below. Units that have defined typedefs and literals can be converted to strings using stream operators or the SI::to_string function.

Unit Dimension Symbol Unit Symbol implemented ratios unit typedefs
Length L m 10-18 to 1018 *_metre_t
Time T s 10-18 to 100 and 60/1, 3600/1 *_seconds_t, minutes_t, hours_t
Mass* M kg 10-15 to 1018 *_gram_t, *_ton_t
Electric current I A 10-18 to 1018 *_ampere_t
Thermodynamic temperature** t K 10-18 to 1018 *_kelvin_t
Amount of substance N mol 10-18 to 1018 *_mol_t
Luminosity J cd 10-18 to 1018 *_candela_t

* for mass the base ratio is kg (not g) as defined in the SI unit table. So there is a mismatch between the literal prefix and the internal representation.

** The dimension symbol for thermodynamic temperature should be Θ (Theta), but the current implementation does not allow for non-ASCII symbols or multi-char symbols

Special Units

Unit Dimension Symbol Exponent Unit Symbol implemented ratios unit typedefs
Area L 2 m2 10-18 to 1018 square_*_metre_t
Volume L 3 m3 10-18 to 1018 cubic_*_metre_t
Frequency T -1 Hz 10-18 to 1018 *_hertz_t
Angle* r 1 rad 10-18 to 1 *_radian_t
Solid Angle* R 1 sr 10-18 to 1 *_sterradian_t

* Angle and solid angle are simple containers, not containing any functionality to do angle/room-angle computation such as an overflow after 2*pi.

Derived units with special names

All units that can be built from other units decay to the respective units by inverting the mathematical operation. I.e if Q = I * T then Q / I = T and Q / T = I

Unit Dimension Symbol Unit Symbol buildable from implemented literals unit typedefs
Velocity v m/s L / T m_p_s, km_p_h, _c metre_per_second_t, kilometre_per_second_t, speed_of_light_t
Acceleration a m/s^2 v / T, v^2 / L none none
Electric charge Q C I * T aC to EC *_coulomb_t
Electric potential U V P / I, E/Q aV to EV *_volt_t
Electric resistance O* Ohm (Ω) U / I, 1/G aOhm to EOhm *_ohm_t
Electric conductance G S I / U, 1/R aS to ES *_siemens_t
Electric capacity C F Q / U aF to EF *_farad_t
Force F N M * a aN to EN *_newton_t
Pressure p pa F / L^2 apa to Epa *_pascal_t
Energy E J F * L, p * L^3 aJ to EJ *_joule_t
Power P W E/T aW to EW *_watt_t
Magnetic Flux f* Wb U * T aWb to EWb *_weber_t
Magnetic Field B T f/L^2 aT to ET *_tesla_t
Momentum o* kg⋅m/s M * v none none
Inductance l H f / I aH to EH *_henry_t
Luminous flux m** lm J * R alm to Elm *_lumen_t
Luminance i* lx m / a alx to Elx *_lux_t
Radioactivity A Bq aBq to EBq *_becquerel_t
Absorbed Dose D Gy aGy to EGy *_gray_t
Equivalent Dose H Sv aSv to ESv *_sievert_t
Catalytic activity K kat N / T akat to Ekat *_katal_t

* These dimensions do not yet have the correct symbols, because the current implementation does not allow for non-ASCII symbols or multi-char symbols. The dimension symbol for electric resistance should be Ω (Ohm) and for magnetic flux Φ (Phi)but. Luminance should be Eb.

** luminous flux should be Φv which is even more less supported than Φ (Phi) itself.

Non-Standard Units

Non standard units are not regulated by the BIPM but are accepted for use with the SI standard.

Unit Dimension Symbol literals implemented ratios unit typedefs
Astronomic Units of length L AU, ly, pc 149597870691:1 (AU), 9460730777119564:1 (ly), 30856775814913700:1 (pc) astronimcal_unit_t (_AU), lightyear_t (_ly), parsec_t (_pc)

Building & compatibility

SI is a header-only library that uses C++17 features. Building is tested using cmake > 3.5 and verified for g++7, g++8, clang5, clang6, clang7, msvc 19, and AppleClang 10.0. It uses conan to download any dependencies for testing, but can be used without it, if the tests are not built.

to build use:

mkdir build
cd build
cmake ..
cmake --build . --config Debug -- -j $(nproc)

substitute --config Debug with --config Release for optimized builds

Installing

The default installation location for SI is /usr/local/lib/SI. SI can be installed using raw cmake, cpack (cmakes package mechanism), or as a conan.io package provided from conan center

See the installation guide for detailed instructions

Packaging

SI is available as 'raw' download from this repository but also as conan package. Getting SI from conan-center is the preferred way.

Implementation details

For further information and deeper technical details refer to the implementation details document

Breaking changes between versions 1.x.x and versions 2.x.x

Versions above 2.0.0 will not be fully compatible with older versions because of the breaking changes mentioned in the changelog. From version 2.0.0 on the conan package is named lower case si to conform to the conan naming convention.

Comments
  • Getting inverse units

    Getting inverse units

    #include <SI/length.h>

    using namespace SI::literals; constexpr auto pitch = 2 / 1_mm; // OK, without constexpr, but need it

    Expected behavior I expected to pitch to be of type 2 mm exp -1 (2 per millimeter) ratio of -1

    I/include/SI/detail/unit.h:474:33: error: ‘(2 / 0)’ is not a constant expression

    opened by ypearson 14
  • Some remarks and issues

    Some remarks and issues

    Hi ! Nice API that seems more user-friendly than boost. I'm testing it.

    1/ Could be nice to add in your documentation ::value() how to cast a SI type to a type such a float. This is somewhat needed. I had to find it back from the code source.

    auto a = 1.5_km;
    std::cout << a.value() << std::endl;
    

    Why not to add something like this ::to<T>() { return T(value()); } ? for example, a.to<int>() will return 1.

    2/ Why degree_t is missing and how to write code such as 1.0_rad + 1.0_deg or degree_t d = 1.0_rad ? I tried this but does not compile:

    using degree_t = SI::radian_t<double, std::ratio<10000, 572958>>;
    degree_t a = 1.0_rad;
    std::cout << a.value() << std::endl;
    

    But only this odd code works:

    using degree_t = SI::velocity_t<double, std::ratio<10000, 572958>>;
    degree_t a = 1.0_m_p_s;
    std::cout << a.value() << std::endl;
    

    3/ You have types such as velocity and acceleration, we have to include the specific header files, but you have not jerk, jounce, crackle, pop (https://en.wikipedia.org/wiki/Fourth,_fifth,_and_sixth_derivatives_of_position), maybe is there a more generic way to generate them?

    4/ Why I cannot display velocities ? The follow code

    #include <SI/length.h>
    #include <SI/time.h>
    #include <SI/velocity.h>
    #include <SI/stream.h>
    
    auto a = 1.0_km / 1.0_s;
    std::cout << a << std::endl;
    

    will produce this error:

    /usr/local/include/SI/stream.h: In instantiation of ‘std::ostream& operator<<(std::ostream&, const SI::detail::unit_t<_symbol, _exponent, _type, _ratio>&) [with char _symbol = 'v'; _exponent = std::ratio<1>; _type = long double; _ratio = std::ratio<1000, 1>; std::ostream = std::basic_ostream<char>]’:
    main.cpp:17:17:   required from here
    /usr/local/include/SI/stream.h:23:26: error: ‘str’ is not a member of ‘SI::unit_symbol<'v', std::ratio<1000, 1>, std::ratio<1> >’
       stream << unit.value() << SI::unit_symbol<_symbol, _ratio, _exponent>::str;
    

    Have I missed an include (same for acceleration) ?

    5/ This code works:

    SI::metre_t<float> a = 1.5_km;
    SI::seconds_t<float> s = 1.0_s;
    SI::metre_per_second_t<float> c = a / s;
    

    But this one fails to compile (because of the double to float conversion):

    SI::metre_t<float> a = 1.5_km;
    SI::metre_per_second_t<float> c = a / 1.0_s;
    

    6/ I'm on the HEAD and not have conan but compilation will fail

     cmake ..
    -- The CXX compiler identification is GNU 8.3.0
    -- Check for working CXX compiler: /usr/bin/c++
    -- Check for working CXX compiler: /usr/bin/c++ -- works
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Detecting CXX compile features
    -- Detecting CXX compile features - done
    CMake Warning at test/CMakeLists.txt:24 (message):
      Conan not found.  Trying to find Catch2 without it.
    
    
    -- Found Doxygen: /usr/local/bin/doxygen (found version "1.8.17 (d4a0825b1d00ead2ce441c3407d1983f80401353*)") found components: doxygen dot 
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/qq/SI/build
    

    Then:

    /home/qq/SI/test/src/benchmarks/unit_assignment_benchmarks.cc: In lambda function:
    /home/qq/SI/test/src/benchmarks/unit_assignment_benchmarks.cc:18:37: error: ‘storage_for’ is not a member of ‘Catch::Benchmark’
           std::vector<Catch::Benchmark::storage_for<ratio_one_unit>> storage(
    
    enhancement in development 
    opened by Lecrapouille 11
  • Unitless types

    Unitless types

    centi_metre_t a = 15; square_metre_t c = a / a; // This is not square meters!!! CHECK_ALMOST_EQUAL(c.value(), 1.0F, 1E-6);

    The units of 'c' are not square metres! In fact 'c' does not have units. So why does this compile?

    enhancement 
    opened by DavidTheLost 10
  • documentation

    documentation

    Dear Dominik

    I am evaluating your great work. Before it may be used, it is always good idea to understand how it works. I wonder if you may add to documentation some details how the architecture works, how dimensions analyse works in your implementation, some very basic, may be few words. I suppose detail::unit_t is a most important class.

    So far from documentation I know that it is: "type safety at compile time".

    enhancement 
    opened by GregKon 6
  • Handle implicit and intermediate dimensions

    Handle implicit and intermediate dimensions

    Hello,

    First, thank you for this great library :)

    Maybe I miss some point here but, is there an easy way to handle these two cases:

    SI::metre_t<double> dx;
    SI::metre_t<double> dy;
    SI::seconds_t<double> dt;
    SI::seconds_t<double> total_duration;
    auto surface_flow = dx * dy / dt;  // compile error because there is no type for m^2/s
    auto total_surface = dx * dy / dt * total_duration;  // compile error but there is a type for m^2
    

    Regards and thank you.

    enhancement 
    opened by spira-inhabitant 5
  • Update README

    Update README

    • Hello ! First line:
    A header only c++ library that provides type safety
    

    Could be nice to explicitly say it is C++17 directly on the 1st line (else said on section "building & compat" which is far away).

    • The illustrative example does not compile (g++ --std=c++17 foo.cpp). I git cloned the HEAD:
    foo.cpp:9:46: error: ‘const struct SI::detail::unit_t<'M', std::ratio<1>, long double, std::ratio<1> >’ has no member named ‘as’
        9 | constexpr auto thousand_grams = one_kilogram.as<SI::gram_t>();
          |                                              ^~
    foo.cpp:9:59: error: missing template arguments before ‘>’ token
        9 | constexpr auto thousand_grams = one_kilogram.as<SI::gram_t>();
          |                                                           ^
    foo.cpp:9:61: error: expected primary-expression before ‘)’ token
        9 | constexpr auto thousand_grams = one_kilogram.as<SI::gram_t>();
          |  
    
    bug 
    opened by Lecrapouille 3
  • a=F/m compile error

    a=F/m compile error

    Trying to calculate acceleration from force divided by mass (Newton's second law), but it gives me a compile error.

    When I try to add: BUILD_UNIT_FROM_DIVISON(acceleration_t, force_t, mass_t) ...in acceleration.h, I get even more compiler errors, looks like an issue where header include orders.

    Reproduced in "SI" version 1.4.1, using clang 7.0.1-8, gcc 8.3.0 and VS2019 16.4.3

    bug invalid question 
    opened by bladan 3
  • Return value with known magnitude

    Return value with known magnitude

    If you have an Length object and you call obj.value() it may not be clear what unit it returns eg. // somewhere in the code SI::milli_metre_t<long double> x{100}; //somewhere else in the code x.value(); // is this in millimeter or meter?

    Provide a way to clearly describe what magnitude the raw value should represent eg. constexpr long double value_as(const Length u) { return (*this/u).value()} //usage long double m = x.value_as(meter); // m=0.1 long double mm = x.value_as(millimeter); // mm=100

    Describe alternatives you've considered Use value() and track base unit in comments or notes

    opened by ypearson 2
  • testing out of the box

    testing out of the box

    Is your feature request related to a problem? Please describe.

    Dear

    I would like test your library, however I have problem with run unit tests "out of the box". I think the instructions: mkdir build cd build cmake .. cmake --build . --config Debug -- -j $(nproc)

    does not cover unit tests because unit test are not build.

    1. Did I missed understand something? (I use cmake 3.17 VS2017, gcc 9.2, windows host)
    2. I also do not understand installing instruction since it is header library.

    /Greg

    question 
    opened by GregKon 2
  • A more intiutive way to define CONSTANTS of derived unit types

    A more intiutive way to define CONSTANTS of derived unit types

    Defining constants of derived data types could be more intiutive, as we have to always give a number before a literal: auto SPEED_CONSTANT = 10_km / 1_h;

    How about allowing the line below or similar: auto SPEED_CONSTANT = 10_km/h;

    enhancement 
    opened by bladan 2
  • I/O functions implementation from/to console and file

    I/O functions implementation from/to console and file

    Obviously, the users of SI library, needs to input values at runtime and view outputs from applications

    In my opinion, if I use a certain physical unit in a determinate scale, I want to see (for default) the variable's value in the scale I chose, with the related symbol

    I am a C ++ amateur and certainly I cannot afford to offer you solutions, especially about generic programming, with extensive use of templates

    opened by sergioferrari 2
  • Documentation, overloaded operations, compilation issue

    Documentation, overloaded operations, compilation issue

    Is your feature request related to a problem? Please describe.

    Hi sir ! Make a long time since https://github.com/bernedom/SI/issues/93 I still have not yet converted my float into SI in my personal project :( I'm currently testing your library back and at the same time testing this one https://github.com/nholthaus/units.

    To help beginners starting with your lib, I think you could add some concrete some basic examples in your documentation. Here is an attempt of mine concerning tricycle kinematics. https://github.com/Lecrapouille/BacASable/tree/master/LawControl/SI

    The code using your lib is here https://github.com/Lecrapouille/BacASable/blob/master/LawControl/SI/si.cpp and the code using units is here https://github.com/Lecrapouille/BacASable/blob/master/LawControl/SI/units.cpp (feel free to use this code).

    I'm sorry, time is currently missing for me for writing this ticket (I do it anyway else I'll forget to write it), as well for making a C++ class of si.cpp like done in units.cpp, but currently si.cpp does note compile because (speed / wheelbase) fails compiling (I hope the issue does not come from me). In addition, I noticed some weak points compared to the other lib:

    Operators that could be overloaded:

    • The x += dt * ... does not compile, we have to write x = x + dt * ... instead.
    • The << speed does not compile. We have to write << speed.value() instead (same for x, heading). In the other lib the unit is also displayed (like 2 mps).
    • Less important but si::cos(heading) does not exist, we have to write instead std::cos(heading.value()) this just make the code more compact but let possible mistake like std::cos(x.value()) with x typed of metre_t.

    Describe the solution you'd like

    • Implement overloading operators such as +=, <<, cos() ...
    • Add some basic examples using your lib.
    • In your documentation, you are using auto but it is better to give the real type like SI::metre_t<double> because we have to find their type back when passing them as function arguments.

    Describe alternatives you've considered Implemented in https://github.com/nholthaus/units.

    Additional context n/a

    opened by Lecrapouille 3
Releases(2.5.1)
  • 2.5.1(Nov 23, 2022)

    • Bugfix: unit.as<other_unit>() automatically infers the underlying type if not explicitely specified.
    • Using Catch2 test discovery in CMake
    Source code(tar.gz)
    Source code(zip)
  • 2.5.0(May 6, 2022)

    • Removed implicit conversion from primitives to unit_t. See issue #106 for details
    • When converting units to string a space is inserted between the value and the unit, as described in the SI brochure, section 5.4.2
      • The numerical value always precedes the unit and a space is always used to separate the unit from the number

    • Fix various spelling errors (thanks to melg8).
    • Renamed sterradiant_t to steradian_t which is correct
    Source code(tar.gz)
    Source code(zip)
  • 2.4.1(Feb 14, 2022)

    • Fix reported issue that operator/(scalar / unit) would calculate the ratio into the value.
    • Add function as<unit_t>() to unit for convenient conversion to a unit of the same type but different ratio
    • CMake Linting
    Source code(tar.gz)
    Source code(zip)
  • 2.4.0(Jan 30, 2022)

  • 2.3.0(Nov 12, 2021)

  • 2.2.0(Oct 4, 2021)

  • 2.1.3(Sep 22, 2021)

    • Fix CI pipeline for windows
    • Add missing conversion between float and double for operator/ and operator* for operations between different units
    Source code(tar.gz)
    Source code(zip)
  • 2.1.2(May 1, 2021)

    • Update to catch 2.13.6 in the conan recipes
    • Remove deployment to bintray.com as it is scheduled to sunset on May 1 2021
    • fix recording of benchmarks
    Source code(tar.gz)
    Source code(zip)
  • 2.1.1(Apr 26, 2021)

    • Tests are built without the need for conan if catch2 is found. (using conan is still the preferred way) fixes #90
    • Cleaning up obsolete todos and typos
    Source code(tar.gz)
    Source code(zip)
  • 2.1.0(Mar 24, 2021)

    • Moved helper function such as unit_cast and unit_with_common_ratio to own file for easier maintenance
    • Moved cross-unit-operations and epsEqual to a separate file for easier maintenance
    • Rename epsEqual() to eps_equals() for consitency with naming scheme
    Source code(tar.gz)
    Source code(zip)
  • 2.0.4(Feb 12, 2021)

  • 2.0.3(Jan 30, 2021)

  • 2.0.2(Dec 17, 2020)

  • 2.0.1(Dec 4, 2020)

    • Refactored type dependent functions to use std::enable_if_v instead of std::enable_if::value
    • Use value types for type traits (i.e. std::is_arithmetic_v instead of std::is_arithmetic::value
    • Add SI::detail::is_ratio_v and SI::detail::is_unit_t_v
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0(Nov 4, 2020)

    • Support for fractions as exponents (Types from version 1.x.x are no longer supported)
    • Rename access to stored scalar values to value() (from previously raw_value()) (Brakes interfaces from 1.x.x)
    • The conan-package is named si instead of SI to match the conan naming convention (Include-paths stay upper case)
    Source code(tar.gz)
    Source code(zip)
  • 1.7.6(Oct 9, 2020)

  • 1.7.5(Aug 22, 2020)

    • conanfile.py pulls the version out of CMakeLists.txt for packaging.
    • Selecting the cmake option SI_INSTALL_LIBRARY=OFF removes the target install completely
    • Add new-line to the end of all files to fit with the ConanCenter code convention.
    Source code(tar.gz)
    Source code(zip)
  • 1.7.4(Aug 10, 2020)

    • If SI is built from within conan the conanbuildinfo provided by conan will be used instead of getting it from github
    • Cleanup of obsolete code
    Source code(tar.gz)
    Source code(zip)
  • 1.7.3(Jul 18, 2020)

  • 1.7.2(Jun 9, 2020)

  • 1.7.1(May 18, 2020)

  • 1.7.0(May 14, 2020)

    • Add literals and typedefs for km/h (_km_p_h) m/s (m_p_s)
    • Add literals for astronomical units of length (AU), lightyears (ly) and parsecs (pc)
    • API documentation is built over the cmake-target api_doc
    Source code(tar.gz)
    Source code(zip)
  • 1.6.1(Apr 7, 2020)

    • Add operators ++ and -- for units
    • Add cmake option SI_ENABLE_TESTING (default ON) to selectively disable tests for SI if used with add_subdirectory() and EXCLUDE_FROM_ALL
    Source code(tar.gz)
    Source code(zip)
  • 1.6.0(Mar 24, 2020)

    • Implicit type conversion for units (i.e. between units with internal double and float representation)
    • Turn installation of by setting the cmake option SI_INSTALL_LIBRARY to OFF (default is ON).
    • Acceleration is buildable from v^2 / L (velocity squared divided by length).
    Source code(tar.gz)
    Source code(zip)
  • 1.5.1(Mar 2, 2020)

  • 1.5.0(Feb 21, 2020)

    • Bugfix: Operators < and > where comparing the wrong way round (this is embarassing)
    • Added Operators <= and =>
    • Installation tests for OSX and Windows
    • Renamed SI/detail/string.h to unit_symbol.h because of resolution-problems in osx/xcode
    Source code(tar.gz)
    Source code(zip)
  • 1.4.1(Feb 14, 2020)

    • Added micro-benchmarks for operations on unit_t (Proving Zero-Overhead for some operations)
    • Pulling catch2 for testing with conan is only done if testing is enabled
    • Removed defaults for template parameters for == and !=
    Source code(tar.gz)
    Source code(zip)
  • 1.4.0(Dec 12, 2019)

    • Rule of five: assignment and construction for units with different ratios
    • Retrieving Catch2 with conan to avoid having it in the repo (This no effect on using SI)
    Source code(tar.gz)
    Source code(zip)
  • 1.3.1(Nov 17, 2019)

  • 1.3.0(Oct 16, 2019)

    • Streaming operators (>> and <<) for all dimension symbols
    • Bugfix: Fixed dimension symbol clash between absorbed dose and equivalent dose
    • Bugfix: Fixed dimension symbol clash between length and inductance
    Source code(tar.gz)
    Source code(zip)
Owner
Dominik Berner
Coder, Agilist and Rock Climber
Dominik Berner
A fast character conversion and transliteration library based on the scheme defined for Japan National Tax Agency (国税庁) 's corporate number (法人番号) system.

jntajis-python Documentation: https://jntajis-python.readthedocs.io/ What's JNTAJIS-python? JNTAJIS-python is a transliteration library, specifically

Open Collector, Inc. 15 Nov 12, 2022
This is a simple C++ implementation of plant-like structures defined with bracketed OLsystems.

Tree Hundred This is a simple C++ implementation of plant-like structures defined with bracketed OLsystems, as described in the book The Algorithmic B

null 22 Apr 22, 2022
Small header-only C++ library that helps to initialize Vulkan instance and device object

Vulkan Extensions & Features Help, or VkExtensionsFeaturesHelp, is a small, header-only, C++ library for developers who use Vulkan API.

Adam Sawicki 11 Oct 12, 2022
a compile-time, header-only, dimensional analysis and unit conversion library built on c++14 with no dependencies.

UNITS A compile-time, header-only, dimensional analysis library built on c++14 with no dependencies. Get in touch If you are using units.h in producti

Nic Holthaus 809 Dec 29, 2022
Minimal, type safe printf replacement library for C++

tinyformat.h A minimal type safe printf() replacement tinyformat.h is a type safe printf replacement library in a single C++ header file. If you've ev

Chris Foster 477 Dec 29, 2022
This library support run-time type casting faster than dynamic_cast ( similar to unreal engine's CastTo )

Fast Runtime Type Casting This library give you C++ Fast Runtime Type Casting faster than dynamic_cast ( similar to Unreal Engine's CastTo, IsChildOf

SungJinKang 7 Jun 11, 2022
match(it): A lightweight header-only pattern-matching library for C++17 with macro-free APIs.

match(it): A lightweight header-only pattern-matching library for C++17 with macro-free APIs. Features Easy to get started. Single header library. Mac

Bowen Fu 434 Dec 27, 2022
C++ header-only library for generic data validation.

C++ header-only library for generic data validation.

Evgeny Sidorov 36 Dec 6, 2022
Small Header only library to parse argv for flags

Small Header only library to parse argv for flags

Ben Wernicke 3 Nov 9, 2022
Header only roguelike rendering library.

Header only roguelike rendering library. Support for Opengl33 and Raylib. Features Support for custom glyph atlasses with up to 65655 tiles of custom

Journeyman 9 Dec 15, 2022
A compile-time enabled Modern C++ library that provides compile-time dimensional analysis and unit/quantity manipulation.

mp-units - A Units Library for C++ The mp-units library is the subject of ISO standardization for C++23/26. More on this can be found in ISO C++ paper

Mateusz Pusz 679 Dec 29, 2022
Library for writing text-based user interfaces

IMPORTANT This library is no longer maintained. It's pretty small if you have a big project that relies on it, just maintain it yourself. Or look for

null 1.9k Dec 22, 2022
A Header-Only Engine that tries to use SFML in a deeper level

⚙️ SFML-Low-Level-Engine ⚙️ A header-only library that tries to use SFML at a deeper level ?? Instalation Download the source code and put the GLD fol

!Gustavo! 4 Aug 27, 2021
Header-only C++20 wrapper for MPI 4.0.

MPI Modern C++20 message passing interface wrapper. Examples Initialization: mpi::environment environment; const auto& communicator = mpi::world_c

Ali Can Demiralp 29 Apr 8, 2022
Header-only lock-free synchronization utilities (one writer, many readers).

stupid Header-only lock-free synchronization utilities (one writer, many readers). No queues Base functionality The base functionality of this library

Colugo 14 Nov 28, 2022
This is a Header-only c++ string implentation which specializes in dealing with small strings. 🧵

string-impl This is a Header-only c++ string implentation which specializes in dealing with small strings. ?? Usage ⌨ Instantiation A string can be in

null 1 Oct 26, 2022
Windows user-land hooks manipulation tool.

MineSweeper Windows user-land hooks manipulation tool. Highlights Supports any x64/x86 Windows DLL (actually, any x64/x86 Windows PE for that matter)

Arsenii Pustovit 130 Dec 9, 2022
Immediate Human User Interface

ImHui Immediate Human User Interface Inspired by Dear ImGui. The purpose of this project is to learn more about how Immedate Mode GUIs actually work.

Tsoding 38 Dec 13, 2022