同步操作将从 智锐科创计算机协会/Mozart++ 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
Mozart++ 是一个用现代 C++ 写成的模版库,用来补足 STL 的短板。
Mozart++ 诞生于我们的日常开发中。通常我们需要在每个项目中造各种各样的“轮子”来满足需求,但造轮子的过程十分痛苦和繁琐,所以,我们决定把这些“轮子”单独抽出来做成一个公共的模版库。
目前为止,我们的项目采用 C++14 语言标准,因为 Mozart++ 最初用来支持的项目就是用 C++14 写成的。
编译器 | 版本 | 测试平台 | 状态 |
---|---|---|---|
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++ 有两个 namespace
, mpp
和 mpp_impl
.
通常情况下开发者只要使用 mpp
中的组建,我们保证所有的实现细节都会隐藏在 mpp_impl
中,不用担心命名空间污染.
现在我们有这些东西(按字母表排序):
mpp::any
: 效率极高的 std::any
mpp::allocator_type
: 通用内存分配器具mpp::codecvt
: 宽字符串和普通字符串的互相转换器,支持ASCII、UTF-8以及GBK编码mpp::event_emitter
: 像 NodeJS 那样的并且无侵入性的 EventEmitter (两个实现):
mpp::event_emitter_fast
(release 构建使用)mpp::event_emitter_attentive
(debug 构建使用, 带有更详细的调试信息)mpp::function
: std::function
的别名mpp::function_parser
: 函数类型萃取器,支持所有 callble
类型mpp::function_type
: 对使用函数类型萃取器得到的函数类型的别名 (即 mpp::function
)mpp::fdistream
: 将 C 的文件描述符和 Windows 的文件句柄包装成 std::istreammpp::fdostream
: 将 C 的文件描述符和 Windows 的文件句柄包装成 std::ostreammpp::format
: 像 Rust 一样好用的字符串格式化函数mpp::iterator_range
: 将 iterator
包装成支持 ranged-for
的对象mpp::optional
: 像 C++17 中的 std::optional
mpp::process
: 跨平台进程交互库拓展库mpp::runtime_error
: 运行时异常mpp::stream
: 流式 API 支持mpp::string_ref
: 字符串的包装类,提供大量字符串操作方法mpp::timer
: 包装与时间操作相关的 APImpp::typelist
: 编译期的类型列表,其元素均为类型变量mpp::throw_ex()
: 异常抛出,但会触发全局的一个 event emitter.首先,打开你的终端(或者 cmd,或者 powershell)
$ cd /path/to/your/project
$ git submodule init
$ git submodule add https://github.com/libmozart/mozart.git third-party/mozart
然后,添加下面这行到项目根目录下的 CMakeLists.txt
中:
add_subdirectory(third-party/mozart)
include_directories(third-party/mozart)
重要提示: 不要忘记将 mozart++
连接到你的目标上.
请保证 CMakeLists.txt
中含有下面这行代码:
target_link_libraries(<your-target> mozart++)
目前我们正在让 Mozart++ 支持其他构建工具,如果您有任何建议, 欢迎来提交 issue 或者 pull request
$ 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());
}
任何贡献都欢迎通过 issue 和 PR 提交!
特别感谢 JetBrains 为开源项目提供免费的 CLion 等 IDE 的授权
MIT License
Copyright (c) 2020 Covariant Institute
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。