GCC Code Coverage Report


Directory: ./
File: src/msrproto/expat_wrapper.h
Date: 2024-02-26 09:07:35
Exec Total Coverage
Lines: 8 8 100.0%
Branches: 0 0 -%

Line Branch Exec Source
1 /*****************************************************************************
2 *
3 * Copyright (C) 2021 Bjarne von Horn (vh at igh dot de)
4 *
5 * This file is part of the PdCom library.
6 *
7 * The PdCom library is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version.
11 *
12 * The PdCom library is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 * License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with the PdCom library. If not, see <http://www.gnu.org/licenses/>.
19 *
20 *****************************************************************************/
21
22 #ifndef MSRPROTO_EXPAT_WRAPPER_H
23 #define MSRPROTO_EXPAT_WRAPPER_H
24
25 #include <exception>
26 #include <functional>
27 #include <memory>
28
29 extern "C" {
30 struct XML_ParserStruct;
31 }
32
33 namespace PdCom { namespace impl { namespace MsrProto {
34 struct XmlParserDeleter
35 {
36 void operator()(XML_ParserStruct *) noexcept;
37 };
38
39 template <typename Handler, bool useExpatBuffer>
40 124 class ExpatWrapper
41 {
42 public:
43 ExpatWrapper(const char *encoding = "UTF-8");
44
45 protected:
46 template <std::size_t Size>
47 class ExpatBuffer
48 {
49 void *buffer_;
50
51 public:
52 explicit ExpatBuffer(ExpatWrapper &);
53 ExpatBuffer(const ExpatBuffer &) = delete;
54 411 ExpatBuffer(ExpatBuffer &&other) noexcept : buffer_(other.buffer_)
55 {
56 411 other.buffer_ = nullptr;
57 411 }
58
59 ExpatBuffer &operator=(const ExpatBuffer &) = delete;
60 ExpatBuffer &operator=(ExpatBuffer &&other) noexcept
61 {
62 ExpatBuffer copy(std::move(other));
63 std::swap(other.buffer_, buffer_);
64 return *this;
65 }
66
67
68 template <typename T = void>
69 422 T *fill() &
70 {
71 422 return static_cast<T *>(buffer_);
72 }
73
74 357 std::size_t size() const { return Size; }
75 };
76
77 template <typename T>
78 typename std::enable_if<
79 !useExpatBuffer && std::is_same<T, char>::value,
80 bool>::type
81 parse(const T *s, std::size_t n, bool final = false);
82 template <size_t buffersize>
83 typename std::enable_if<(useExpatBuffer && buffersize > 0), bool>::type
84 parse(ExpatBuffer<buffersize> buffer, std::size_t n, bool final = false);
85
86 void reset(const char *encoding = "UTF-8");
87 843 int level() const noexcept { return level_; }
88
89 private:
90 struct CallbackWrapper;
91
92 std::unique_ptr<XML_ParserStruct, XmlParserDeleter> parser_;
93 std::exception_ptr pending_exception_ = nullptr;
94 int level_ = 0;
95 };
96
97
98 }}} // namespace PdCom::impl::MsrProto
99
100
101 #endif // MSRPROTO_EXPAT_WRAPPER_H
102