aboutsummaryrefslogtreecommitdiff
path: root/thirdparty/fmt/test/mock-allocator.h
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2025-11-07 14:49:13 +0100
committerGitHub Enterprise <[email protected]>2025-11-07 14:49:13 +0100
commit24e43a913f29ac3b314354e8ce5175f135bcc64f (patch)
treeca442937ceeb63461012b33a4576e9835099f106 /thirdparty/fmt/test/mock-allocator.h
parentget oplog attachments (#622) (diff)
downloadzen-24e43a913f29ac3b314354e8ce5175f135bcc64f.tar.xz
zen-24e43a913f29ac3b314354e8ce5175f135bcc64f.zip
switch to xmake for package management (#611)
This change removes our dependency on vcpkg for package management, in favour of bringing some code in-tree in the `thirdparty` folder as well as using the xmake build-in package management feature. For the latter, all the package definitions are maintained in the zen repo itself, in the `repo` folder. It should now also be easier to build the project as it will no longer depend on having the right version of vcpkg installed, which has been a common problem for new people coming in to the codebase. Now you should only need xmake to build. * Bumps xmake requirement on github runners to 2.9.9 to resolve an issue where xmake on Windows invokes cmake with `v144` toolchain which does not exist * BLAKE3 is now in-tree at `thirdparty/blake3` * cpr is now in-tree at `thirdparty/cpr` * cxxopts is now in-tree at `thirdparty/cxxopts` * fmt is now in-tree at `thirdparty/fmt` * robin-map is now in-tree at `thirdparty/robin-map` * ryml is now in-tree at `thirdparty/ryml` * sol2 is now in-tree at `thirdparty/sol2` * spdlog is now in-tree at `thirdparty/spdlog` * utfcpp is now in-tree at `thirdparty/utfcpp` * xmake package repo definitions is in `repo` * implemented support for sanitizers. ASAN is supported on windows, TSAN, UBSAN, MSAN etc are supported on Linux/MacOS though I have not yet tested it extensively on MacOS * the zencore encryption implementation also now supports using mbedTLS which is used on MacOS, though for now we still use openssl on Linux * crashpad * bumps libcurl to 8.11.0 (from 8.8.0) which should address a rare build upload bug
Diffstat (limited to 'thirdparty/fmt/test/mock-allocator.h')
-rw-r--r--thirdparty/fmt/test/mock-allocator.h88
1 files changed, 88 insertions, 0 deletions
diff --git a/thirdparty/fmt/test/mock-allocator.h b/thirdparty/fmt/test/mock-allocator.h
new file mode 100644
index 000000000..0bf015a42
--- /dev/null
+++ b/thirdparty/fmt/test/mock-allocator.h
@@ -0,0 +1,88 @@
+// Formatting library for C++ - mock allocator
+//
+// Copyright (c) 2012 - present, Victor Zverovich
+// All rights reserved.
+//
+// For the license information refer to format.h.
+
+#ifndef FMT_MOCK_ALLOCATOR_H_
+#define FMT_MOCK_ALLOCATOR_H_
+
+#include <assert.h> // assert
+#include <stddef.h> // size_t
+
+#include <memory> // std::allocator_traits
+
+#include "gmock/gmock.h"
+
+template <typename T> class mock_allocator {
+ public:
+ using value_type = T;
+ using size_type = size_t;
+
+ using pointer = T*;
+ using const_pointer = const T*;
+ using reference = T&;
+ using const_reference = const T&;
+ using difference_type = ptrdiff_t;
+
+ template <typename U> struct rebind {
+ using other = mock_allocator<U>;
+ };
+
+ mock_allocator() {}
+ mock_allocator(const mock_allocator&) {}
+
+ MOCK_METHOD(T*, allocate, (size_t));
+ MOCK_METHOD(void, deallocate, (T*, size_t));
+};
+
+template <typename Allocator, bool PropagateOnMove = true> class allocator_ref {
+ private:
+ Allocator* alloc_;
+
+ void move(allocator_ref& other) {
+ alloc_ = other.alloc_;
+ other.alloc_ = nullptr;
+ }
+
+ public:
+ using value_type = typename Allocator::value_type;
+ using propagate_on_container_move_assignment =
+ fmt::bool_constant<PropagateOnMove>;
+
+ explicit allocator_ref(Allocator* alloc = nullptr) : alloc_(alloc) {}
+
+ allocator_ref(const allocator_ref& other) : alloc_(other.alloc_) {}
+ allocator_ref(allocator_ref&& other) { move(other); }
+
+ allocator_ref& operator=(allocator_ref&& other) {
+ assert(this != &other);
+ move(other);
+ return *this;
+ }
+
+ allocator_ref& operator=(const allocator_ref& other) {
+ alloc_ = other.alloc_;
+ return *this;
+ }
+
+ public:
+ auto get() const -> Allocator* { return alloc_; }
+
+ auto allocate(size_t n) -> value_type* {
+ return std::allocator_traits<Allocator>::allocate(*alloc_, n);
+ }
+ void deallocate(value_type* p, size_t n) { alloc_->deallocate(p, n); }
+
+ friend auto operator==(allocator_ref a, allocator_ref b) noexcept -> bool {
+ if (a.alloc_ == b.alloc_) return true;
+ return a.alloc_ && b.alloc_ && *a.alloc_ == *b.alloc_;
+ }
+
+ friend auto operator!=(allocator_ref a, allocator_ref b) noexcept -> bool {
+ return !(a == b);
+ }
+};
+
+#endif // FMT_MOCK_ALLOCATOR_H_