All Projects β†’ mpusz β†’ Units

mpusz / Units

Licence: mit
A compile-time enabled Modern C++ library that provides compile-time dimensional analysis and unit/quantity manipulation.

Programming Languages

cpp
1120 projects

Projects that are alternatives of or similar to Units

Length.js
πŸ“ JavaScript library for length units conversion.
Stars: ✭ 292 (-20%)
Mutual labels:  library, units, units-of-measure
Hazelcast Cpp Client
Hazelcast IMDG C++ Client
Stars: ✭ 67 (-81.64%)
Mutual labels:  cmake, library
Membrain
🧠 Type-safe memory units
Stars: ✭ 53 (-85.48%)
Mutual labels:  library, units
Raz
Modern & multiplatform game engine in C++17
Stars: ✭ 161 (-55.89%)
Mutual labels:  cmake, library
Safe Units
Type-safe TypeScript units of measure πŸ‘·πŸ“
Stars: ✭ 137 (-62.47%)
Mutual labels:  units, units-of-measure
Unit Api
Units of Measurement API
Stars: ✭ 140 (-61.64%)
Mutual labels:  units, units-of-measure
Rttr
C++ Reflection Library
Stars: ✭ 2,031 (+456.44%)
Mutual labels:  cmake, library
Vrt
πŸ”… Ray tracing library for Vulkan API (indev)
Stars: ✭ 111 (-69.59%)
Mutual labels:  cmake, library
Rawspeed
fast raw decoding library
Stars: ✭ 179 (-50.96%)
Mutual labels:  cmake, library
measured
Type-safe, intuitive units of measure
Stars: ✭ 81 (-77.81%)
Mutual labels:  units-of-measure, units
UnitfulAstro.jl
An extension of Unitful.jl for astronomers.
Stars: ✭ 18 (-95.07%)
Mutual labels:  units-of-measure, units
Coulomb
coulomb: unit analysis for Scala
Stars: ✭ 109 (-70.14%)
Mutual labels:  units, units-of-measure
Indriya
JSR 385 - Reference Implementation
Stars: ✭ 74 (-79.73%)
Mutual labels:  units, units-of-measure
Rink Rs
Unit conversion tool and library written in rust
Stars: ✭ 242 (-33.7%)
Mutual labels:  units, units-of-measure
Unitsnet
Makes life working with units of measurement just a little bit better.
Stars: ✭ 641 (+75.62%)
Mutual labels:  units, units-of-measure
Cdt
C++ library for constrained Delaunay triangulation (CDT)
Stars: ✭ 165 (-54.79%)
Mutual labels:  cmake, library
Unitful.jl
Physical quantities with arbitrary units
Stars: ✭ 279 (-23.56%)
Mutual labels:  units, units-of-measure
Reproc
A cross-platform (C99/C++11) process library
Stars: ✭ 325 (-10.96%)
Mutual labels:  cmake, library
Aestheticdialogs
πŸ“± An Android Library for πŸ’«fluid, 😍beautiful, 🎨custom Dialogs.
Stars: ✭ 352 (-3.56%)
Mutual labels:  library
Material Calendar View
πŸ“… Material Design Calendar compatible with API 11+
Stars: ✭ 360 (-1.37%)
Mutual labels:  library

GitHub license Conan CI CMake CI GitHub Workflow Documentation Conan stable Conan testing

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 P1935 and CppCon 2020 talk. We are actively looking for parties interested in field trialing the library.

Documentation

An extensive project documentation including installation instructions and user's guide can be found on mp-units GitHub Pages.

TL;DR

mp-units is a compile-time enabled Modern C++ library that provides compile-time dimensional analysis and unit/quantity manipulation. The basic idea and design heavily bases on std::chrono::duration and extends it to work properly with many dimensions.

Here is a small example of possible operations:

#include <units/isq/si/area.h>
#include <units/isq/si/frequency.h>
#include <units/isq/si/speed.h>

using namespace units::isq::si;

// simple numeric operations
static_assert(10_q_km / 2 == 5_q_km);

// unit conversions
static_assert(1_q_h == 3600_q_s);
static_assert(1_q_km + 1_q_m == 1001_q_m);

// dimension conversions
static_assert(1_q_km / 1_q_s == 1000_q_m_per_s);
static_assert(2_q_km_per_h * 2_q_h == 4_q_km);
static_assert(2_q_km / 2_q_km_per_h == 1_q_h);

static_assert(2_q_m * 3_q_m == 6_q_m2);

static_assert(10_q_km / 5_q_km == 2);

static_assert(1000 / 1_q_s == 1_q_kHz);

Try it on the Compiler Explorer.

This library requires some C++20 features (concepts, classes as NTTPs, ...). Thanks to them the user gets a powerful but still easy to use interface and all unit conversions and dimensional analysis can be performed without sacrificing on accuracy. Please see the below example for a quick preview of basic library features:

#include <units/format.h>
#include <units/isq/si/speed.h>
#include <units/isq/si/international/speed.h>
#include <units/quantity_io.h>
#include <iostream>

using namespace units::isq;

constexpr Speed auto avg_speed(Length auto d, Time auto t)
{
  return d / t;
}

int main()
{
  using namespace units::isq::si::literals;
  using namespace units::isq::si::unit_constants;

  constexpr Speed auto v1 = 110 * km / h;
  constexpr Speed auto v2 = avg_speed(220_q_km, 2_q_h);
  constexpr Speed auto v3 = avg_speed(si::length<si::international::mile>(140), si::time<si::hour>(2));
  constexpr Speed auto v4 = quantity_cast<si::speed<si::metre_per_second>>(v2);
  constexpr Speed auto v5 = quantity_cast<si::metre_per_second>(v3);
  constexpr Speed auto v6 = quantity_cast<int>(v5);

  std::cout << v1 << '\n';                                  // 110 km/h
  std::cout << fmt::format("{}", v2) << '\n';               // 110 km/h
  std::cout << fmt::format("{:*^14}", v3) << '\n';          // ***70 mi/h****
  std::cout << fmt::format("{:%Q in %q}", v4) << '\n';      // 30.5556 in m/s
  std::cout << fmt::format("{0:%Q} in {0:%q}", v5) << '\n'; // 31.2928 in m/s
  std::cout << fmt::format("{:%Q}", v6) << '\n';            // 31
}

Try it on the Compiler Explorer.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].