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{
17
21
25
26 // TODO: Optimize, maintaining string compatibility
27 // Use basic_string::resize_and_overwrite in C++23
28 // https://en.cppreference.com/w/cpp/string/basic_string/resize_and_overwrite
33 template <typename = void>
34 class charbuff_t final : public std::string
35 {
36 public:
37 charbuff_t() noexcept { }
38 charbuff_t(const charbuff_t&) = default;
39 charbuff_t(charbuff_t&&) noexcept = default;
40 charbuff_t(size_t size)
41 {
42 std::string::resize(size);
43 }
44 charbuff_t(std::string&& str)
45 : std::string(std::move(str)) { }
46 charbuff_t(const char* str, size_t size)
47 : std::string(str, size) { }
48 explicit charbuff_t(const bufferview& view)
49 : std::string(view.data(), view.size()) { }
50 explicit charbuff_t(const std::string_view& view)
51 : std::string(view) { }
52 explicit charbuff_t(const std::string& str)
53 : std::string(str) { }
54 public:
55 charbuff_t& operator=(const charbuff_t&) = default;
56 charbuff_t& operator=(charbuff_t&&) noexcept = default;
57 charbuff_t& operator=(const std::string_view & view)
58 {
59 std::string::assign(view.data(), view.size());
60 return *this;
61 }
62 charbuff_t& operator=(const std::string& str)
63 {
64 std::string::assign(str.data(), str.size());
65 return *this;
66 }
67 charbuff_t& operator=(const bufferview& view)
68 {
69 std::string::assign(view.data(), view.size());
70 return *this;
71 }
72 charbuff_t& operator=(std::string&& str) noexcept
73 {
74 std::string::operator=(std::move(str));
75 return *this;
76 }
77 bool operator==(const charbuff_t& rhs) const
78 {
79 return static_cast<const std::string&>(*this) == static_cast<const std::string&>(rhs);
80 }
81 private:
82 size_t length() const = delete;
83 };
84
85 template <typename = void>
86 bool operator==(const charbuff_t<>& lhs, const char* rhs)
87 {
88 return static_cast<const std::string&>(lhs) == rhs;
89 }
90
91 template <typename = void>
92 bool operator==(const char* lhs, const charbuff_t<>& rhs)
93 {
94 return lhs == static_cast<const std::string&>(rhs);
95 }
96
97 template <typename = void>
98 bool operator==(const charbuff_t<>& lhs, const bufferview& rhs)
99 {
100 return static_cast<const std::string&>(lhs) == std::string_view(rhs.data(), rhs.size());
101 }
102
103 template <typename = void>
104 bool operator==(const bufferview& lhs, const charbuff_t<>& rhs)
105 {
106 return std::string_view(lhs.data(), lhs.size()) == static_cast<const std::string&>(rhs);
107 }
108
109 template <typename = void>
110 bool operator==(const charbuff_t<>& lhs, const std::string_view& rhs) noexcept
111 {
112 return std::string_view(lhs) == rhs;
113 }
114
115 template <typename = void>
116 bool operator==(const std::string_view& lhs, const charbuff_t<>& rhs) noexcept
117 {
118 return lhs == std::string_view(rhs);
119 }
120
121 template <typename = void>
122 bool operator==(const charbuff_t<>& lhs, const std::string& rhs) noexcept
123 {
124 return static_cast<const std::string&>(lhs) == rhs;
125 }
126
127 template <typename = void>
128 bool operator==(const std::string& lhs, const charbuff_t<>& rhs) noexcept
129 {
130 return lhs == static_cast<const std::string&>(rhs);
131 }
132
133 using charbuff = charbuff_t<>;
134
139 template <typename = void>
141 {
142 public:
143 datahandle_t() { }
144 datahandle_t(const bufferview& view)
145 : m_view(view) { }
147 : m_buff(new charbuff_t<>(std::move(buff))), m_view(*m_buff) { }
148 datahandle_t(std::unique_ptr<const charbuff_t<>>&& buff)
149 : m_buff(std::move(buff)), m_view(*m_buff) { }
150 datahandle_t(std::unique_ptr<charbuff_t<>>&& buff)
151 : m_buff(std::move(buff)), m_view(*m_buff) { }
152 datahandle_t(std::shared_ptr<const charbuff_t<>> buff)
153 : m_buff(std::move(buff)), m_view(*m_buff) { }
154 datahandle_t(std::shared_ptr<charbuff_t<>> buff)
155 : m_buff(std::move(buff)), m_view(*m_buff) { }
156 public:
157 const bufferview& view() const { return m_view; }
158 private:
159 std::shared_ptr<const charbuff_t<>> m_buff;
160 bufferview m_view;
161 };
162
164
165 // https://artificial-mind.net/blog/2020/10/03/always-false
166 template <class... T>
167 constexpr bool always_false = false;
168}
169
170#endif // PODOFO_BASE_TYPES_H
Convenient type for char array storage and/or buffer with std::string compatibility.
Definition basetypes.h:35
A const data provider that can hold a view to a static segments or a shared buffer.
Definition basetypes.h:141
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:24
tcb::span< const T, Extent > cspan
Constant span.
Definition span.h:19
mspan< char > bufferspan
Convenient writable char buffer span.
Definition basetypes.h:20
tcb::span< T, Extent > mspan
Mutable span.
Definition span.h:24
cspan< char > bufferview
Convenient read-only char buffer span.
Definition basetypes.h:16