Source code for algebraixlib.cache_status
"""Defines CacheStatus class, a quaternary-valued type used to represent several algebraic
properties (such as left-functional) that may apply to MathObjects or classes supporting the
MathObjects interface (such as Undef).
"""
# Copyright Algebraix Data Corporation 2015 - 2017
#
# This file is part of algebraixlib <http://github.com/AlgebraixData/algebraixlib>.
#
# algebraixlib is free software: you can redistribute it and/or modify it under the terms of version
# 3 of the GNU Lesser General Public License as published by the Free Software Foundation.
#
# algebraixlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License along with algebraixlib.
# If not, see <http://www.gnu.org/licenses/>.
# --------------------------------------------------------------------------------------------------
[docs]class CacheStatus:
r"""Provide the 4 states that we use for caching the property values for `MathObject`\s.
In ``_flags.Flags`` we provide 2-bit bitfields that store the cached value of properties that
are associated with the `MathObject` instances. This class provides symbols for the values
that we store in these bitfields and functions that work on them.
See also [PropCache].
"""
#: Value of the 2-bit bitfield if the associated property is unknown. When accessed, it will be
#: evaluated and set to one of the other states. This is the only state that can change.
#: This value is special in that it sets both bits of the 2-bit bitfield to 0. There is logic
#: elsewhere that depends on all bits being 0 meaning 'all properties are unknown'. This is in
#: alignment with the default state of a structure without any explicit initialization; it seems
#: to be 'all bits 0'. (We didn't find documentation that confirms this, but it seems to be the
#: case.)
UNKNOWN = 0
#: Value of the 2-bit bitfield if the associated property is known to be true. Once a bitfield
#: is set to this state, its value cannot change anymore.
IS = 1 # pylint: disable=invalid-name
#: Value of the 2-bit bitfield if the associated property is known to be false. Once a bitfield
#: is set to this state, its value cannot change anymore.
IS_NOT = 2
#: Value of the 2-bit bitfield if the associated property is known to be undefined (that is, it
#: doesn't apply). For example, :term:`functional` is not defined for :term:`set`\s of
#: :term:`atom`\s. Once a bitfield is set to this state, its value cannot change anymore. (The
#: name ``N_A`` has been chosen instead of ``UNDEFINED`` to avoid confusion with `UNKNOWN`
#: and to simplify working with IDEs.)
N_A = 3
@staticmethod
[docs] def from_bool(bool_value: bool) -> int:
"""Return the ``CacheStatus`` value that corresponds to the Boolean ``bool_value``."""
return CacheStatus.IS if bool_value else CacheStatus.IS_NOT
@staticmethod
[docs] def is_bool(cache_status: int) -> bool:
"""Return ``True`` if ``cache_status`` represents a Boolean (``IS`` or ``IS_NOT``)."""
return cache_status == CacheStatus.IS or cache_status == CacheStatus.IS_NOT