Mozart++ is a cross-platform template library written in Modern C++ designed to make up for essential but missing components in STL.
Mozart++ was born in our daily development. We usually build all kinds of "wheels" in a project, but the process is just so trivial, as a result, we decided to put these "wheels" out as a separate template library.
Currently our project is written in C++14 because our main project which Mozart++ originally aimed to support was written in C++14.
Compiler | Version | Tested Platform | Status |
---|---|---|---|
gcc | 8.1.0-x86_64 | Ubuntu 18.04 | ✅ |
gcc | 7.4.0-x86_64 | WSL Ubuntu 18.04 | ✅ |
Apple Clang | 11.0.0 | macOS Catalina | ✅ |
mingw-gcc | 8.1.0 (x86_64-posix-seh-rev0) | Windows 10 Pro 1903 | ✅ |
msvc | 19.24.28316 | Windows 10 Pro 1903 | ✅ |
Mozart++ has two namespace
s, mpp
and mpp_impl
.
Usually developers only need to use mpp
. We promise that all implementations will be hidden in mpp_impl
.
Currently we have these tools listed below (ordered alphabetically):
- A
mpp::any
: A super effectivestd::any
.mpp::allocator_type
: Memory allocator.
- C
mpp::codecvt
: Wide string and string converter supports ascii, utf-8 and GBK.
- E
mpp::event_emitter
: A NodeJS-like, non-invasive EventEmitter (two implementations):mpp::event_emitter_fast
(for release)mpp::event_emitter_attentive
(for debug, with more debug information)
- F
mpp::function
: An alias forstd::function
.mpp::function_parser
: A function type trait for extracting all information from a callable type.mpp::function_type
: An alias for parsed function type (akampp::function
).mpp::fdistream
: Wrap a C file descriptor and Windows File Handle into C++ std::istream.mpp::fdostream
: Wrap a C file descriptor and Windows File Handle into C++ std::ostream.mpp::format
: Rust-like string formatter.
- I
mpp::iterator_range
: A range adapter for a pair of iterators, wrapping two iterators into range-compatible interface.
- O
mpp::optional
: Something likestd::optional
- P
mpp::process
: Cross-platform process interacting library.
- R
mpp::runtime_error
: Customized runtime exception.
- S
mpp::stream
: Stream API support.mpp::string_ref
: String wrapper with plenty of useful string manipulation methods.
- T
mpp::timer
: Time operation wrapper.mpp::typelist
: Compile-time list holding types as its elements.mpp::throw_ex()
: Exception thrower which triggers global event emitter.
First of all, open your terminal (or powershell, or cmd)
$ cd /path/to/your/project
$ git submodule init
$ git submodule add https://github.com/libmozart/mozart.git third-party/mozart
Then, add the following lines to your root CMakeLists.txt
:
add_subdirectory(third-party/mozart)
include_directories(third-party/mozart)
NOTICE: Do not forget to link mozart++
to your target.
Please make sure your CMakeLists.txt
contains the following line:
target_link_libraries(<your-target> mozart++)
We are currently working on it. If you have any idea, feel free to create issues or pull requests.
$ git clone --recursive https://github.com/libmozart/mozart.git
$ cd mozart
$ mkdir build
$ cd build
$ cmake .. && make
$ make test
-
Event Emitter
mpp::event_emitter e; // register events e.on("player-login", [](mpp::string_ref username) { checkUsername(username); }); e.on("player-move", [](point from, point to) { checkMovement(from, to); }); // some other places e.emit("player-login", username); e.emit("player-move", {1, 2}, {3, 4});
-
Format
using mpp::format; // format to string auto str = mpp::format("Hello {}, welcome to C++\n", name); // format to stream mpp::format(std::cout, "Position {}\n", std::vector<int>{1, 2, 3});
-
Stream
stream<int>::iterate(1, [](int x) { return x * 2; }) .map([](int x) { return x - 1; }) .filter([](int x) { return x > 1000; }) .drop_while([](int x) { return x <= 100000; }) .drop(5) .take_while([](int x) { return x <= 5000000; }) .for_each([](int x) { printf("%d\n", x); });
-
Optional
int sum(const mpp::optional<std::vector<int>> &nums) { return nums.apply_or<int>(0, [](auto &&v) -> int { int s = 0; for (auto &&e : v) { s += e; } return s; }); }
-
Process
using mpp::process; process p = process::exec("/bin/bash"); p.in() << "ls /" << std::endl; p.in() << "exit" << std::endl; p.wait_for(); std::string s; while (std::getline(p.out(), s)) { printf("%s\n", s.c_str()); }
Contributions and ideas are welcomed through issues and PRs.
We would like to thank JetBrains for sharing free open-source licences of amazing tools such as CLion.
MIT License
Copyright (c) 2020 Covariant Institute