Skip to content

Commit 94b51be

Browse files
committed
simplify some headers, better progress indicator
1 parent ce280d9 commit 94b51be

25 files changed

+681
-626
lines changed

CMakeLists.txt

+6-8
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,6 @@ add_subdirectory(dep)
1010
add_library(rlib STATIC
1111
lib/rlib/common.hpp
1212
lib/rlib/common.cpp
13-
lib/rlib/error.cpp
14-
lib/rlib/error.hpp
15-
lib/rlib/fbuffer.cpp
16-
lib/rlib/fbuffer.hpp
1713
lib/rlib/iofile.cpp
1814
lib/rlib/iofile.hpp
1915
lib/rlib/rbundle.cpp
@@ -22,6 +18,8 @@ add_library(rlib STATIC
2218
lib/rlib/rcache.cpp
2319
lib/rlib/rcdn.hpp
2420
lib/rlib/rcdn.cpp
21+
lib/rlib/rchunk.hpp
22+
lib/rlib/rchunk.cpp
2523
lib/rlib/rmanifest.cpp
2624
lib/rlib/rmanifest.hpp
2725
)
@@ -37,14 +35,14 @@ target_link_libraries(rman-ls PRIVATE rlib)
3735
add_executable(rman-bl src/rman_bl.cpp)
3836
target_link_libraries(rman-bl PRIVATE rlib)
3937

40-
add_executable(rbun-add src/rbun_add.cpp)
41-
target_link_libraries(rbun-add PRIVATE rlib)
42-
4338
add_executable(rbun-chk src/rbun_chk.cpp)
4439
target_link_libraries(rbun-chk PRIVATE rlib)
4540

4641
add_executable(rbun-ls src/rbun_ls.cpp)
4742
target_link_libraries(rbun-ls PRIVATE rlib)
4843

44+
add_executable(rbun-merge src/rbun_merge.cpp)
45+
target_link_libraries(rbun-merge PRIVATE rlib)
46+
4947
add_executable(rbun-usage src/rbun_usage.cpp)
50-
target_link_libraries(rbun-usage PRIVATE rlib)
48+
target_link_libraries(rbun-usage PRIVATE rlib)

lib/rlib/common.cpp

+60-21
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,61 @@
22

33
#include <zstd.h>
44

5-
#include "error.hpp"
5+
#include <cstdarg>
6+
#include <cstdio>
7+
#include <iomanip>
8+
#include <iostream>
69

710
using namespace rlib;
811

9-
auto rlib::progress(char const* banner, std::uint32_t index, std::uint64_t done, std::uint64_t total) noexcept
10-
-> std::string {
11-
constexpr auto MB = 1024.0 * 1024.0;
12+
void rlib::throw_error(char const* from, char const* msg) {
13+
// break point goes here
14+
throw std::runtime_error(std::string(from) + msg);
15+
}
16+
17+
error_stack_t& rlib::error_stack() noexcept {
18+
thread_local error_stack_t instance = {};
19+
return instance;
20+
}
21+
22+
void rlib::push_error_msg(char const* fmt, ...) noexcept {
23+
va_list args;
24+
char buffer[4096];
25+
int result;
26+
va_start(args, fmt);
27+
result = vsnprintf(buffer, 4096, fmt, args);
28+
va_end(args);
29+
if (result >= 0) {
30+
error_stack().push_back({buffer, buffer + result});
31+
}
32+
}
33+
34+
rlib::progress_bar::progress_bar(char const* banner,
35+
bool disabled,
36+
std::uint32_t index,
37+
std::uint64_t done,
38+
std::uint64_t total) noexcept
39+
: banner_(banner), disabled_(disabled), index_(index), done_(done), total_(total), percent_(done_ * 100 / total_) {
40+
this->render();
41+
}
42+
43+
rlib::progress_bar::~progress_bar() noexcept {
44+
this->render();
45+
std::cerr << std::endl;
46+
}
47+
48+
auto rlib::progress_bar::render() const noexcept -> void {
1249
char buffer[128];
13-
sprintf(buffer, "%s #%u: %4.3f / %4.3f", banner, index, done / MB, total / MB);
14-
return buffer;
50+
sprintf(buffer, "\r%s #%u: %.02fMB %u%%", banner_, index_, total_ / MB, (std::uint32_t)percent_);
51+
std::cerr << buffer;
52+
}
53+
54+
auto rlib::progress_bar::update(std::uint64_t done) noexcept -> void {
55+
done_ = done;
56+
auto percent = std::exchange(percent_, done_ * 100 / total_);
57+
if (!disabled_ && percent != percent_) {
58+
this->render();
59+
}
1560
}
1661

1762
auto rlib::to_hex(std::uint64_t id, std::size_t s) noexcept -> std::string {
@@ -36,25 +81,19 @@ auto rlib::clean_path(std::string path) noexcept -> std::string {
3681

3782
auto rlib::zstd_decompress(std::span<char const> src, std::size_t count) -> std::span<char const> {
3883
thread_local static std::vector<char> buffer = {};
84+
std::size_t size_decompressed = rlib_assert_zstd(ZSTD_findDecompressedSize(src.data(), src.size()));
85+
rlib_assert(size_decompressed == count);
3986
if (buffer.size() < count) {
87+
buffer.clear();
4088
buffer.resize(count);
4189
}
42-
auto result = ZSTD_decompress(buffer.data(), count, src.data(), src.size());
43-
if (ZSTD_isError(result)) {
44-
rlib_error(ZSTD_getErrorName(result));
45-
}
46-
rlib_assert(result == count);
90+
std::size_t result = rlib_assert_zstd(ZSTD_decompress(buffer.data(), count, src.data(), src.size()));
91+
rlib_assert(result == size_decompressed);
4792
return {buffer.data(), count};
4893
}
4994

50-
auto rlib::try_zstd_decompress(std::span<char const> src, std::size_t count) -> std::span<char const> {
51-
thread_local static std::vector<char> buffer = {};
52-
if (buffer.size() < count) {
53-
buffer.resize(count);
54-
}
55-
auto result = ZSTD_decompress(buffer.data(), count, src.data(), src.size());
56-
if (ZSTD_isError(result)) {
57-
return {};
58-
}
59-
return {buffer.data(), result};
95+
auto rlib::zstd_frame_decompress_size(std::span<char const> src) -> std::size_t {
96+
ZSTD_frameHeader header = {};
97+
rlib_assert_zstd(ZSTD_getFrameHeader(&header, src.data(), src.size()));
98+
return header.frameContentSize;
6099
}

lib/rlib/common.hpp

+83-4
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,107 @@
55
#include <cstddef>
66
#include <cstring>
77
#include <functional>
8+
#include <optional>
89
#include <span>
10+
#include <stdexcept>
911
#include <string>
1012
#include <string_view>
13+
#include <system_error>
1114
#include <tuple>
1215
#include <type_traits>
1316
#include <vector>
1417

18+
#define rlib_paste_impl(x, y) x##y
19+
#define rlib_paste(x, y) rlib_paste_impl(x, y)
20+
21+
#define rlib_error(msg) ::rlib::throw_error(__func__, msg)
22+
23+
#define rlib_assert(...) \
24+
do { \
25+
if (!(__VA_ARGS__)) [[unlikely]] { \
26+
::rlib::throw_error(__func__, ": " #__VA_ARGS__); \
27+
} \
28+
} while (false)
29+
30+
#define rlib_rethrow(...) \
31+
[&, func = __func__]() -> decltype(auto) { \
32+
try { \
33+
return __VA_ARGS__; \
34+
} catch (std::exception const&) { \
35+
::rlib::throw_error(func, ": " #__VA_ARGS__); \
36+
} \
37+
}()
38+
39+
#define rlib_trace(...) \
40+
::rlib::ErrorTrace rlib_paste(_trace_, __LINE__) { \
41+
[&] { ::rlib::push_error_msg(__VA_ARGS__); } \
42+
}
43+
44+
#define rlib_assert_zstd(...) \
45+
[&, func = __func__]() -> std::size_t { \
46+
if (std::size_t result = __VA_ARGS__; ZSTD_isError(result)) [[unlikely]] { \
47+
throw_error(func, ZSTD_getErrorName(result)); \
48+
} else { \
49+
return result; \
50+
} \
51+
}()
52+
1553
namespace rlib {
54+
[[noreturn]] extern void throw_error(char const* from, char const* msg);
55+
56+
[[noreturn]] inline void throw_error(char const* from, std::error_code const& ec) {
57+
throw_error(from, ec.message().c_str());
58+
}
59+
60+
using error_stack_t = std::vector<std::string>;
61+
62+
extern error_stack_t& error_stack() noexcept;
63+
64+
extern void push_error_msg(char const* fmt, ...) noexcept;
65+
66+
struct progress_bar {
67+
static constexpr auto MB = 1024.0 * 1024.0;
68+
69+
progress_bar(char const* banner,
70+
bool disabled,
71+
std::uint32_t index,
72+
std::uint64_t done,
73+
std::uint64_t total) noexcept;
74+
~progress_bar() noexcept;
75+
76+
auto update(std::uint64_t done) noexcept -> void;
77+
78+
private:
79+
auto render() const noexcept -> void;
80+
81+
char const* banner_;
82+
bool disabled_ = {};
83+
std::uint32_t index_;
84+
std::uint64_t done_;
85+
std::uint64_t total_;
86+
std::uint64_t percent_;
87+
};
88+
89+
template <typename Func>
90+
struct ErrorTrace : Func {
91+
inline ErrorTrace(Func&& func) noexcept : Func(std::move(func)) {}
92+
inline ~ErrorTrace() noexcept {
93+
if (std::uncaught_exceptions()) {
94+
Func::operator()();
95+
}
96+
}
97+
};
1698
extern auto to_hex(std::uint64_t id, std::size_t s = 16) noexcept -> std::string;
1799

18100
template <typename T>
19101
requires(std::is_enum_v<T>)
20102
inline auto to_hex(T id, std::size_t s = 16) noexcept -> std::string { return to_hex((std::uint64_t)id, s); }
21103

22-
extern auto progress(char const* banner, std::uint32_t index, std::uint64_t done, std::uint64_t total) noexcept
23-
-> std::string;
24-
25104
extern auto clean_path(std::string path) noexcept -> std::string;
26105

27106
extern auto zstd_decompress(std::span<char const> src, std::size_t count) -> std::span<char const>;
28107

29-
extern auto try_zstd_decompress(std::span<char const> src, std::size_t count) -> std::span<char const>;
108+
extern auto zstd_frame_decompress_size(std::span<char const> src) -> std::size_t;
30109

31110
template <auto... M>
32111
inline auto sort_by(auto beg, auto end) noexcept -> void {

lib/rlib/error.cpp

-28
This file was deleted.

lib/rlib/error.hpp

-55
This file was deleted.

lib/rlib/fbuffer.cpp

-1
This file was deleted.

0 commit comments

Comments
 (0)