1 /* 2 * Copyright 2021 Max Kellermann <max.kellermann@gmail.com> 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * - Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 11 * - Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the 14 * distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 19 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 20 * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 23 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 25 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 27 * OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30 #ifndef YAJL_GEN_HXX 31 #define YAJL_GEN_HXX 32 33 #include "util/ConstBuffer.hxx" 34 35 #include <yajl/yajl_gen.h> 36 37 #include <algorithm> 38 #include <string_view> 39 40 namespace Yajl { 41 42 /** 43 * OO wrapper for #yajl_gen. 44 */ 45 class Gen { 46 yajl_gen gen = nullptr; 47 48 public: 49 Gen() = default; 50 Gen(const yajl_alloc_funcs * allocFuncs)51 explicit Gen(const yajl_alloc_funcs *allocFuncs) noexcept 52 :gen(yajl_gen_alloc(allocFuncs)) {} 53 Gen(Gen && src)54 Gen(Gen &&src) noexcept 55 :gen(std::exchange(src.gen, nullptr)) {} 56 ~Gen()57 ~Gen() noexcept { 58 if (gen != nullptr) 59 yajl_gen_free(gen); 60 } 61 operator =(Gen && src)62 Gen &operator=(Gen &&src) noexcept { 63 using std::swap; 64 swap(gen, src.gen); 65 return *this; 66 } 67 Integer(long long int number)68 void Integer(long long int number) noexcept { 69 yajl_gen_integer(gen, number); 70 } 71 String(std::string_view s)72 void String(std::string_view s) noexcept { 73 yajl_gen_string(gen, (const unsigned char *)s.data(), s.size()); 74 } 75 OpenMap()76 void OpenMap() noexcept { 77 yajl_gen_map_open(gen); 78 } 79 CloseMap()80 void CloseMap() noexcept { 81 yajl_gen_map_close(gen); 82 } 83 OpenArray()84 void OpenArray() noexcept { 85 yajl_gen_array_open(gen); 86 } 87 CloseArray()88 void CloseArray() noexcept { 89 yajl_gen_array_close(gen); 90 } 91 GetBuffer() const92 ConstBuffer<char> GetBuffer() const noexcept { 93 const unsigned char *buf; 94 size_t len; 95 auto status = yajl_gen_get_buf(gen, &buf, &len); 96 if (status != yajl_gen_status_ok) 97 return nullptr; 98 99 return {(const char *)buf, len}; 100 } 101 }; 102 103 } // namespace Yajl 104 105 #endif 106