"""
Summary and synthetic providers for LLDB-specific shared pointers

Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
See https://llvm.org/LICENSE.txt for license information.
SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
"""


class SharedPtr_SyntheticChildrenProvider:

    def __init__(self, valobj, dict):
        self.valobj = valobj
        self.update()

    def update(self):
        pass

    def num_children(self):
        return 1

    def get_child_index(self, name):
        if name == "ptr":
            return 0
        if name == "count":
            return 1
        return None

    def get_child_at_index(self, index):
        if index == 0:
            return self.valobj.GetChildMemberWithName('_M_ptr')
        if index == 1:
            return self.valobj.GetChildMemberWithName('_M_refcount').GetChildMemberWithName(
                '_M_pi').GetChildMemberWithName('_M_use_count')
        return None


def SharedPtr_SummaryProvider(valobj, dict):
    return 'use = ' + \
        str(valobj.GetChildMemberWithName("count").GetValueAsUnsigned())


class ValueObjectSP_SyntheticChildrenProvider:

    def __init__(self, valobj, dict):
        self.valobj = valobj
        self.update()

    def update(self):
        pass

    def num_children(self):
        return 1

    def get_child_index(self, name):
        if name == "ptr":
            return 0
        if name == "count":
            return 1
        return None

    def get_child_at_index(self, index):
        if index == 0:
            return self.valobj.GetChildMemberWithName('ptr_')
        if index == 1:
            return self.valobj.GetChildMemberWithName(
                'cntrl_').GetChildMemberWithName('shared_owners_')
        return None


def ValueObjectSP_SummaryProvider(valobj, dict):
    return 'use = ' + \
        str(1 + valobj.GetChildMemberWithName("count").GetValueAsUnsigned())


def __lldb_init_module(debugger, dict):
    debugger.HandleCommand(
        'type summary add -x ".*ValueObjectSP" --expand -F sp_cp.ValueObjectSP_SummaryProvider')
    debugger.HandleCommand(
        'type synthetic add -x ".*ValueObjectSP" -l sp_cp.ValueObjectSP_SyntheticChildrenProvider')
    debugger.HandleCommand(
        'type summary add -x ".*SP" --expand -F sp_cp.SharedPtr_SummaryProvider')
    debugger.HandleCommand(
        'type synthetic add -x ".*SP" -l sp_cp.SharedPtr_SyntheticChildrenProvider')
