PoDoFo 1.2.0
Loading...
Searching...
No Matches
basetypes.h
1// SPDX-FileCopyrightText: 2022 Francesco Pretto <ceztko@gmail.com>
2// SPDX-License-Identifier: LGPL-2.0-or-later OR MPL-2.0
3
4#ifndef PODOFO_BASE_TYPES_H
5#define PODOFO_BASE_TYPES_H
6#pragma once
7
8#include <string>
9#include <memory>
10#include "span.h"
11
12namespace PoDoFo
13{
16
19
22
23 // TODO: Optimize, maintaining string compatibility
24 // Use basic_string::resize_and_overwrite in C++23
25 // https://en.cppreference.com/w/cpp/string/basic_string/resize_and_overwrite
28 template <typename = void>
29 class charbuff_t final : public std::string
30 {
31 public:
32 charbuff_t() noexcept { }
33 charbuff_t(const charbuff_t&) = default;
34 charbuff_t(charbuff_t&&) noexcept = default;
35 charbuff_t(size_t size)
36 {
37 std::string::resize(size);
38 }
39 charbuff_t(std::string&& str)
40 : std::string(std::move(str)) { }
41 charbuff_t(const char* str, size_t size)
42 : std::string(str, size) { }
43 explicit charbuff_t(const bufferview& view)
44 : std::string(view.data(), view.size()) { }
45 explicit charbuff_t(const std::string_view& view)
46 : std::string(view) { }
47 explicit charbuff_t(const std::string& str)
48 : std::string(str) { }
49 public:
50 charbuff_t& operator=(const charbuff_t&) = default;
51 charbuff_t& operator=(charbuff_t&&) noexcept = default;
52 charbuff_t& operator=(const std::string_view & view)
53 {
54 std::string::assign(view.data(), view.size());
55 return *this;
56 }
57 charbuff_t& operator=(const std::string& str)
58 {
59 std::string::assign(str.data(), str.size());
60 return *this;
61 }
62 charbuff_t& operator=(const bufferview& view)
63 {
64 std::string::assign(view.data(), view.size());
65 return *this;
66 }
67 charbuff_t& operator=(std::string&& str) noexcept
68 {
69 std::string::operator=(std::move(str));
70 return *this;
71 }
72 bool operator==(const charbuff_t& rhs) const
73 {
74 return static_cast<const std::string&>(*this) == static_cast<const std::string&>(rhs);
75 }
76 private:
77 size_t length() const = delete;
78 };
79
80 template <typename = void>
81 bool operator==(const charbuff_t<>& lhs, const char* rhs)
82 {
83 return static_cast<const std::string&>(lhs) == rhs;
84 }
85
86 template <typename = void>
87 bool operator==(const char* lhs, const charbuff_t<>& rhs)
88 {
89 return lhs == static_cast<const std::string&>(rhs);
90 }
91
92 template <typename = void>
93 bool operator==(const charbuff_t<>& lhs, const bufferview& rhs)
94 {
95 return static_cast<const std::string&>(lhs) == std::string_view(rhs.data(), rhs.size());
96 }
97
98 template <typename = void>
99 bool operator==(const bufferview& lhs, const charbuff_t<>& rhs)
100 {
101 return std::string_view(lhs.data(), lhs.size()) == static_cast<const std::string&>(rhs);
102 }
103
104 template <typename = void>
105 bool operator==(const charbuff_t<>& lhs, const std::string_view& rhs) noexcept
106 {
107 return std::string_view(lhs) == rhs;
108 }
109
110 template <typename = void>
111 bool operator==(const std::string_view& lhs, const charbuff_t<>& rhs) noexcept
112 {
113 return lhs == std::string_view(rhs);
114 }
115
116 template <typename = void>
117 bool operator==(const charbuff_t<>& lhs, const std::string& rhs) noexcept
118 {
119 return static_cast<const std::string&>(lhs) == rhs;
120 }
121
122 template <typename = void>
123 bool operator==(const std::string& lhs, const charbuff_t<>& rhs) noexcept
124 {
125 return lhs == static_cast<const std::string&>(rhs);
126 }
127
128 using charbuff = charbuff_t<>;
129
133 template <typename = void>
135 {
136 public:
137 datahandle_t() { }
138 datahandle_t(const bufferview& view)
139 : m_view(view) { }
141 : m_buff(new charbuff_t<>(std::move(buff))), m_view(*m_buff) { }
142 datahandle_t(std::unique_ptr<const charbuff_t<>>&& buff)
143 : m_buff(std::move(buff)), m_view(*m_buff) { }
144 datahandle_t(std::unique_ptr<charbuff_t<>>&& buff)
145 : m_buff(std::move(buff)), m_view(*m_buff) { }
146 datahandle_t(std::shared_ptr<const charbuff_t<>> buff)
147 : m_buff(std::move(buff)), m_view(*m_buff) { }
148 datahandle_t(std::shared_ptr<charbuff_t<>> buff)
149 : m_buff(std::move(buff)), m_view(*m_buff) { }
150 public:
151 const bufferview& view() const { return m_view; }
152 private:
153 std::shared_ptr<const charbuff_t<>> m_buff;
154 bufferview m_view;
155 };
156
158
159 // https://artificial-mind.net/blog/2020/10/03/always-false
160 template <class... T>
161 constexpr bool always_false = false;
162}
163
164#endif // PODOFO_BASE_TYPES_H
Convenient type for char array storage and/or buffer with std::string compatibility.
Definition basetypes.h:30
A const data provider that can hold a view to a static segments or a shared buffer.
Definition basetypes.h:135
All classes, functions, types and enums of PoDoFo are members of these namespace.
Definition basetypes.h:13
cspan< char32_t > unicodeview
Unicode code point view.
Definition basetypes.h:21
tcb::span< const T, Extent > cspan
Constant span.
Definition span.h:18
mspan< char > bufferspan
Convenient writable char buffer span.
Definition basetypes.h:18
tcb::span< T, Extent > mspan
Mutable span.
Definition span.h:22
cspan< char > bufferview
Convenient read-only char buffer span.
Definition basetypes.h:15