// 
//  Copyright (c) 2024 Dmitry Arkhipov (grisumbras@yandex.ru)
// 
//  Distributed under the Boost Software License, Version 1.0. (See accompanying
//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// 
//  Official repository: https://github.com/boostorg/json
// 

// Autogenerated from boost_json_gdb_printers.py by boost-pretty-printers

#ifndef BOOST_JSON_DETAIL_GDB_PRINTERS_HPP
#define BOOST_JSON_DETAIL_GDB_PRINTERS_HPP

#if defined(__ELF__)

#if defined(__clang__)
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Woverlength-strings"
#elif defined(__GNUC__)
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Woverlength-strings"
#endif

__asm__(
  ".pushsection \".debug_gdb_scripts\", \"MS\",%progbits,1\n"
  ".ascii \"\\4gdb.inlined-script.BOOST_JSON_DETAIL_GDB_PRINTERS_HPP\\n\"\n"
  ".ascii \"import gdb\\n\"\n"
  ".ascii \"import gdb.printing\\n\"\n"


  ".ascii \"class PrettyPrinterBuilder():\\n\"\n"
  ".ascii \"    '''decorator that accumulates pretty printers for types'''\\n\"\n"

  ".ascii \"    def __init__(self, name=None):\\n\"\n"
  ".ascii \"        self.result = gdb.printing.RegexpCollectionPrettyPrinter(\\n\"\n"
  ".ascii \"            name or 'Boost.JSON')\\n\"\n"

  ".ascii \"    def __call__(self, pp=None, ns=None, template=False):\\n\"\n"
  ".ascii \"        if pp is None:\\n\"\n"
  ".ascii \"            def decorator(pp):\\n\"\n"
  ".ascii \"                return self(pp, ns=ns, template=template)\\n\"\n"
  ".ascii \"            return decorator\\n\"\n"

  ".ascii \"        typename = getattr(pp, '__name__')\\n\"\n"
  ".ascii \"        ns = ns or 'boost::json'\\n\"\n"
  ".ascii \"        self.result.add_printer(\\n\"\n"
  ".ascii \"            typename,\\n\"\n"
  ".ascii \"            '^{ns}::{typename}{marker}'.format(\\n\"\n"
  ".ascii \"                ns=ns,\\n\"\n"
  ".ascii \"                typename=typename,\\n\"\n"
  ".ascii \"                marker='<'if template else '$'),\\n\"\n"
  ".ascii \"            pp)\\n\"\n"
  ".ascii \"        return pp\\n\"\n"

  ".ascii \"pretty_printer = PrettyPrinterBuilder()\\n\"\n"


  ".ascii \"class static_property:\\n\"\n"
  ".ascii \"    '''decorator for lazy evaluation of static members'''\\n\"\n"

  ".ascii \"    def __init__(self, wrapped):\\n\"\n"
  ".ascii \"        self.wrapped = wrapped\\n\"\n"
  ".ascii \"        self.__name__ = wrapped.__name__\\n\"\n"
  ".ascii \"        self.__doc__ = wrapped.__doc__\\n\"\n"

  ".ascii \"    def __get__(self, inst, objtype=None):\\n\"\n"
  ".ascii \"        val = self.wrapped()\\n\"\n"
  ".ascii \"        if objtype is not None:\\n\"\n"
  ".ascii \"            setattr(objtype, self.wrapped.__name__, val)\\n\"\n"
  ".ascii \"        return val\\n\"\n"


  ".ascii \"@pretty_printer\\n\"\n"
  ".ascii \"class storage_ptr:\\n\"\n"
  ".ascii \"    '''boost::json::storage_ptr pretty printer'''\\n\"\n"

  ".ascii \"    @static_property\\n\"\n"
  ".ascii \"    def _size_t():\\n\"\n"
  ".ascii \"        return gdb.lookup_type('std::size_t')\\n\"\n"

  ".ascii \"    @static_property\\n\"\n"
  ".ascii \"    def _shared_resource_ptr():\\n\"\n"
  ".ascii \"        return gdb.lookup_type(\\n\"\n"
  ".ascii \"            'boost::json::detail::shared_resource').pointer()\\n\"\n"

  ".ascii \"    @static_property\\n\"\n"
  ".ascii \"    def _memory_resource_ptr():\\n\"\n"
  ".ascii \"        return gdb.lookup_type(\\n\"\n"
  ".ascii \"            'boost::container::pmr::memory_resource').pointer()\\n\"\n"

  ".ascii \"    def __init__(self, val):\\n\"\n"
  ".ascii \"        self.val = val['i_']\\n\"\n"

  ".ascii \"    def to_string(self):\\n\"\n"
  ".ascii \"        items = []\\n\"\n"

  ".ascii \"        if bool(self.val & 2):\\n\"\n"
  ".ascii \"            items.append('trivial')\\n\"\n"
  ".ascii \"        shared = bool(self.val & 1)\\n\"\n"
  ".ascii \"        if shared:\\n\"\n"
  ".ascii \"            items.append('shared')\\n\"\n"

  ".ascii \"        pointer = self.val & ~3\\n\"\n"
  ".ascii \"        if not pointer:\\n\"\n"
  ".ascii \"            items.append('resource=default')\\n\"\n"
  ".ascii \"        else:\\n\"\n"
  ".ascii \"            if shared:\\n\"\n"
  ".ascii \"                resource = pointer.cast(\\n\"\n"
  ".ascii \"                    self._shared_resource_ptr).dereference()\\n\"\n"
  ".ascii \"                impl_t = resource.dynamic_type\\n\"\n"
  ".ascii \"                impl_ptr = impl_t.pointer()\\n\"\n"
  ".ascii \"                resource = resource.address.cast(impl_ptr).dereference()\\n\"\n"

  ".ascii \"                items.append(\\n\"\n"
  ".ascii \"                    'refs=%s' % resource['refs'].cast(self._size_t))\\n\"\n"

  ".ascii \"                resource = resource['t']\\n\"\n"
  ".ascii \"            else:\\n\"\n"
  ".ascii \"                resource = pointer.cast(\\n\"\n"
  ".ascii \"                    self._memory_resource_ptr).dereference()\\n\"\n"


  ".ascii \"            derived_t = resource.dynamic_type\\n\"\n"
  ".ascii \"            derived_ptr = derived_t.pointer()\\n\"\n"
  ".ascii \"            resource = resource.address.cast(derived_ptr).dereference()\\n\"\n"
  ".ascii \"            items.append('resource=%s' % resource)\\n\"\n"

  ".ascii \"        return 'storage_ptr [' + ', '.join(items) + ']'\\n\"\n"


  ".ascii \"@pretty_printer\\n\"\n"
  ".ascii \"class monotonic_resource:\\n\"\n"
  ".ascii \"    '''boost::json::monotonic_resource pretty printer'''\\n\"\n"

  ".ascii \"    def __init__(self, val):\\n\"\n"
  ".ascii \"        self.val = val\\n\"\n"

  ".ascii \"    def to_string(self):\\n\"\n"
  ".ascii \"        buffer = self.val['buffer_']\\n\"\n"
  ".ascii \"        buffer = buffer['p'] - ( int(buffer['size']) - int(buffer['avail']) )\\n\"\n"

  ".ascii \"        head = self.val['head_'].dereference()\\n\"\n"

  ".ascii \"        block = head['p'] - ( int(head['size']) - int(head['avail']) )\\n\"\n"

  ".ascii \"        upstream = self.val['upstream_']\\n\"\n"

  ".ascii \"        items = []\\n\"\n"
  ".ascii \"        items.append('buffer=%s' % buffer)\\n\"\n"
  ".ascii \"        items.append('block=%s' % block)\\n\"\n"
  ".ascii \"        items.append('head=%s' % head['p'])\\n\"\n"
  ".ascii \"        items.append('free=%s' % head['avail'])\\n\"\n"
  ".ascii \"        if upstream['i_'] != 0:\\n\"\n"
  ".ascii \"            items.append('upstream=%s' % upstream)\\n\"\n"

  ".ascii \"        return 'monotonic_resource [%s]' % ', '.join(items)\\n\"\n"


  ".ascii \"@pretty_printer\\n\"\n"
  ".ascii \"class static_resource:\\n\"\n"
  ".ascii \"    '''boost::json::static_resource pretty printer'''\\n\"\n"

  ".ascii \"    def __init__(self, val):\\n\"\n"
  ".ascii \"        self.val = val\\n\"\n"

  ".ascii \"    def to_string(self):\\n\"\n"
  ".ascii \"        buf = self.val['p_'] - ( int(self.val['size_']) - int(self.val['n_']) )\\n\"\n"
  ".ascii \"        return 'static_resource [buffer=%s, head=%s, free=%s]' % (\\n\"\n"
  ".ascii \"            buf, self.val['p_'], self.val['n_'])\\n\"\n"


  ".ascii \"@pretty_printer\\n\"\n"
  ".ascii \"class string:\\n\"\n"
  ".ascii \"    '''boost::json::string pretty printer'''\\n\"\n"

  ".ascii \"    @static_property\\n\"\n"
  ".ascii \"    def _char_const_ptr():\\n\"\n"
  ".ascii \"        return gdb.lookup_type('char').const().pointer()\\n\"\n"

  ".ascii \"    def __init__(self, val):\\n\"\n"
  ".ascii \"        self.impl = val['impl_']\\n\"\n"

  ".ascii \"    def display_hint(self):\\n\"\n"
  ".ascii \"        return 'string'\\n\"\n"

  ".ascii \"    def to_string(self):\\n\"\n"
  ".ascii \"        kind = self.impl['s_']['k']\\n\"\n"
  ".ascii \"        if kind == self.impl['short_string_']:\\n\"\n"
  ".ascii \"            sbo_size = self.impl['sbo_chars_']\\n\"\n"
  ".ascii \"            size = sbo_size - self.impl['s_']['buf'][sbo_size]\\n\"\n"
  ".ascii \"            pointer = self.impl['s_']['buf']\\n\"\n"
  ".ascii \"        elif kind == self.impl['key_string_']:\\n\"\n"
  ".ascii \"            size = self.impl['k_']['n']\\n\"\n"
  ".ascii \"            pointer = self.impl['k_']['s']\\n\"\n"
  ".ascii \"        else:\\n\"\n"
  ".ascii \"            size = self.impl['p_']['t'].dereference()['size']\\n\"\n"
  ".ascii \"            pointer = self.impl['p_']['t']\\n\"\n"
  ".ascii \"            pointer += 1\\n\"\n"
  ".ascii \"            pointer = pointer.cast(self._char_const_ptr)\\n\"\n"
  ".ascii \"        return pointer.lazy_string(length=size)\\n\"\n"


  ".ascii \"@pretty_printer\\n\"\n"
  ".ascii \"class array:\\n\"\n"
  ".ascii \"    '''boost::json::array pretty printer'''\\n\"\n"

  ".ascii \"    @static_property\\n\"\n"
  ".ascii \"    def _value_ptr():\\n\"\n"
  ".ascii \"        return gdb.lookup_type('boost::json::value').pointer()\\n\"\n"

  ".ascii \"    def __init__(self, val):\\n\"\n"
  ".ascii \"        self.val = val\\n\"\n"

  ".ascii \"    def display_hint(self):\\n\"\n"
  ".ascii \"        return 'array'\\n\"\n"

  ".ascii \"    def to_string(self):\\n\"\n"
  ".ascii \"        capacity = int(self.val['t_'].dereference()['capacity'])\\n\"\n"
  ".ascii \"        return 'array [size={0}, capacity={1}]'.format(\\n\"\n"
  ".ascii \"            self.num_children(), capacity)\\n\"\n"

  ".ascii \"    def num_children(self):\\n\"\n"
  ".ascii \"        return int(self.val['t_'].dereference()['size'])\\n\"\n"

  ".ascii \"    def children(self):\\n\"\n"
  ".ascii \"        for i in range(0, self.num_children()):\\n\"\n"
  ".ascii \"            yield self.child(i)\\n\"\n"

  ".ascii \"    def child(self, n):\\n\"\n"
  ".ascii \"        table = (self.val['t_'] + 1).cast(self._value_ptr)\\n\"\n"
  ".ascii \"        return str(n), table[n]\\n\"\n"


  ".ascii \"@pretty_printer\\n\"\n"
  ".ascii \"class key_value_pair:\\n\"\n"
  ".ascii \"    '''boost::json::key_value_pair pretty printer'''\\n\"\n"

  ".ascii \"    @staticmethod\\n\"\n"
  ".ascii \"    def _pair(kv):\\n\"\n"
  ".ascii \"        return kv['key_'].lazy_string(length=kv['len_']), kv['value_']\\n\"\n"

  ".ascii \"    def __init__(self, val):\\n\"\n"
  ".ascii \"        self.val = val\\n\"\n"

  ".ascii \"    def to_string(self):\\n\"\n"
  ".ascii \"        k, v = self._pair(self.val)\\n\"\n"
  ".ascii \"        return '[%s] = %s' % (k.value(), v)\\n\"\n"


  ".ascii \"@pretty_printer\\n\"\n"
  ".ascii \"class object:\\n\"\n"
  ".ascii \"    '''boost::json::object pretty printer'''\\n\"\n"

  ".ascii \"    def __init__(self, val):\\n\"\n"
  ".ascii \"        self.val = val\\n\"\n"
  ".ascii \"        self.kv_ptr = gdb.lookup_type('boost::json::key_value_pair').pointer()\\n\"\n"

  ".ascii \"    def display_hint(self):\\n\"\n"
  ".ascii \"        return 'map'\\n\"\n"

  ".ascii \"    def to_string(self):\\n\"\n"
  ".ascii \"        capacity = int(self.val['t_'].dereference()['capacity'])\\n\"\n"
  ".ascii \"        return 'object [size={}, capacity={}]'.format(\\n\"\n"
  ".ascii \"            self.num_children(), capacity)\\n\"\n"

  ".ascii \"    def num_children(self):\\n\"\n"
  ".ascii \"        return int(self.val['t_'].dereference()['size'])\\n\"\n"

  ".ascii \"    def children(self):\\n\"\n"
  ".ascii \"        table = (self.val['t_'] + 1).cast(self.kv_ptr)\\n\"\n"
  ".ascii \"        for i in range(0, self.num_children()):\\n\"\n"
  ".ascii \"            k, v = key_value_pair._pair(table[i])\\n\"\n"
  ".ascii \"            yield str(2 * i), k\\n\"\n"
  ".ascii \"            yield str(2 * i + 1), v\\n\"\n"


  ".ascii \"@pretty_printer\\n\"\n"
  ".ascii \"class value:\\n\"\n"
  ".ascii \"    '''boost::json::value pretty printer'''\\n\"\n"

  ".ascii \"    @static_property\\n\"\n"
  ".ascii \"    def _kind_t():\\n\"\n"
  ".ascii \"        result = gdb.lookup_type('boost::json::kind')\\n\"\n"
  ".ascii \"        return dict(result.items())\\n\"\n"

  ".ascii \"    def __init__(self, val):\\n\"\n"
  ".ascii \"        self.val = val\\n\"\n"

  ".ascii \"    def to_string(self):\\n\"\n"
  ".ascii \"        kind = self.val['sca_']['k']\\n\"\n"

  ".ascii \"        if self._compare_kind(kind, 'null'):\\n\"\n"
  ".ascii \"            return 'null'\\n\"\n"

  ".ascii \"        elif self._compare_kind(kind, 'bool_'):\\n\"\n"
  ".ascii \"            return self.val['sca_']['b']\\n\"\n"

  ".ascii \"        elif self._compare_kind(kind, 'int64'):\\n\"\n"
  ".ascii \"            return self.val['sca_']['i']\\n\"\n"

  ".ascii \"        elif self._compare_kind(kind, 'uint64'):\\n\"\n"
  ".ascii \"            return self.val['sca_']['u']\\n\"\n"

  ".ascii \"        elif self._compare_kind(kind, 'double_'):\\n\"\n"
  ".ascii \"            return self.val['sca_']['d']\\n\"\n"

  ".ascii \"        elif self._compare_kind(kind, 'array'):\\n\"\n"
  ".ascii \"            return self.val['arr_']\\n\"\n"

  ".ascii \"        elif self._compare_kind(kind, 'object'):\\n\"\n"
  ".ascii \"            return self.val['obj_']\\n\"\n"

  ".ascii \"        else:\\n\"\n"
  ".ascii \"            return self.val['str_']\\n\"\n"

  ".ascii \"    def _compare_kind(self, kind, name):\\n\"\n"
  ".ascii \"        return kind == self._kind_t['boost::json::kind::' + name].enumval\\n\"\n"


  ".ascii \"def register(obj_file):\\n\"\n"
  ".ascii \"    mod = obj_file or gdb\\n\"\n"
  ".ascii \"    for printer in getattr(mod, 'pretty_printers', []):\\n\"\n"
  ".ascii \"        if getattr(printer, 'name') == pretty_printer.result.name:\\n\"\n"
  ".ascii \"            return\\n\"\n"

  ".ascii \"    gdb.printing.register_pretty_printer(\\n\"\n"
  ".ascii \"        obj_file,\\n\"\n"
  ".ascii \"        pretty_printer.result)\\n\"\n"


  ".ascii \"if __name__ == '__main__':\\n\"\n"
  ".ascii \"    register(gdb.current_objfile())\\n\"\n"
  ".byte 0\n"
  ".popsection\n");
#if defined(__clang__)
#  pragma clang diagnostic pop
#elif defined(__GNUC__)
#  pragma GCC diagnostic pop
#endif

#endif // defined(__ELF__)

#endif // BOOST_JSON_DETAIL_GDB_PRINTERS_HPP
