"""
Objective-C runtime wrapper for use by LLDB Python formatters

part of The LLVM Compiler Infrastructure
This file is distributed under the University of Illinois Open Source
License. See LICENSE.TXT for details.
"""


class AttributesDictionary:

    def __init__(self, allow_reset=True):
        # need to do it this way to prevent endless recursion
        self.__dict__['_dictionary'] = {}
        self.__dict__['_allow_reset'] = allow_reset

    def __getattr__(self, name):
        if not self._check_exists(name):
            return None
        value = self._dictionary[name]
        return value

    def _set_impl(self, name, value):
        self._dictionary[name] = value

    def _check_exists(self, name):
        return name in self._dictionary

    def __setattr__(self, name, value):
        if self._allow_reset:
            self._set_impl(name, value)
        else:
            self.set_if_necessary(name, value)

    def set_if_necessary(self, name, value):
        if not self._check_exists(name):
            self._set_impl(name, value)
            return True
        return False

    def __len__(self):
        return len(self._dictionary)
