Commit 0bb6f98b authored by Xavier Thompson's avatar Xavier Thompson

Disallow 'const' qualifier for cypclass types

parent 608c29a9
...@@ -431,7 +431,6 @@ def inject_acthon_interfaces(self): ...@@ -431,7 +431,6 @@ def inject_acthon_interfaces(self):
result_scope.var_entries.append(result_pushVoidStar_entry) result_scope.var_entries.append(result_pushVoidStar_entry)
result_getVoidStar_type = PyrexTypes.CFuncType(PyrexTypes.c_void_ptr_type, [], nogil = 1) result_getVoidStar_type = PyrexTypes.CFuncType(PyrexTypes.c_void_ptr_type, [], nogil = 1)
result_getVoidStar_type.is_const_method = 1
result_getVoidStar_entry = result_scope.declare("getVoidStarResult", "getVoidStarResult", result_getVoidStar_entry = result_scope.declare("getVoidStarResult", "getVoidStarResult",
result_getVoidStar_type, None, "extern") result_getVoidStar_type, None, "extern")
result_getVoidStar_entry.is_cfunction = 1 result_getVoidStar_entry.is_cfunction = 1
...@@ -447,7 +446,6 @@ def inject_acthon_interfaces(self): ...@@ -447,7 +446,6 @@ def inject_acthon_interfaces(self):
result_scope.var_entries.append(result_pushInt_entry) result_scope.var_entries.append(result_pushInt_entry)
result_getInt_type = PyrexTypes.CFuncType(PyrexTypes.c_int_type, [], nogil = 1) result_getInt_type = PyrexTypes.CFuncType(PyrexTypes.c_int_type, [], nogil = 1)
result_getInt_type.is_const_method = 1
result_getInt_entry = result_scope.declare("getIntResult", "getIntResult", result_getInt_entry = result_scope.declare("getIntResult", "getIntResult",
result_getInt_type, None, "extern") result_getInt_type, None, "extern")
result_getInt_entry.is_cfunction = 1 result_getInt_entry.is_cfunction = 1
...@@ -495,7 +493,6 @@ def inject_acthon_interfaces(self): ...@@ -495,7 +493,6 @@ def inject_acthon_interfaces(self):
sync_entry.is_type = 1 sync_entry.is_type = 1
sync_isActivable_type = PyrexTypes.CFuncType(PyrexTypes.c_bint_type, [], nogil = 1) sync_isActivable_type = PyrexTypes.CFuncType(PyrexTypes.c_bint_type, [], nogil = 1)
sync_isActivable_type.is_const_method = 1
sync_isActivable_entry = sync_scope.declare("isActivable", "isActivable", sync_isActivable_entry = sync_scope.declare("isActivable", "isActivable",
sync_isActivable_type, None, "extern") sync_isActivable_type, None, "extern")
sync_isActivable_entry.is_cfunction = 1 sync_isActivable_entry.is_cfunction = 1
...@@ -503,7 +500,6 @@ def inject_acthon_interfaces(self): ...@@ -503,7 +500,6 @@ def inject_acthon_interfaces(self):
sync_scope.var_entries.append(sync_isActivable_entry) sync_scope.var_entries.append(sync_isActivable_entry)
sync_isCompleted_type = PyrexTypes.CFuncType(PyrexTypes.c_bint_type, [], nogil = 1) sync_isCompleted_type = PyrexTypes.CFuncType(PyrexTypes.c_bint_type, [], nogil = 1)
sync_isCompleted_type.is_const_method = 1
sync_isCompleted_entry = sync_scope.declare("isCompleted", "isCompleted", sync_isCompleted_entry = sync_scope.declare("isCompleted", "isCompleted",
sync_isCompleted_type, None, "extern") sync_isCompleted_type, None, "extern")
sync_isCompleted_entry.is_cfunction = 1 sync_isCompleted_entry.is_cfunction = 1
...@@ -578,7 +574,6 @@ def inject_acthon_interfaces(self): ...@@ -578,7 +574,6 @@ def inject_acthon_interfaces(self):
queue_scope.var_entries.append(queue_activate_entry) queue_scope.var_entries.append(queue_activate_entry)
queue_is_empty_type = PyrexTypes.CFuncType(PyrexTypes.c_bint_type, [], nogil = 1) queue_is_empty_type = PyrexTypes.CFuncType(PyrexTypes.c_bint_type, [], nogil = 1)
queue_is_empty_type.is_const_method = 1
queue_is_empty_entry = queue_scope.declare("is_empty", "is_empty", queue_is_empty_entry = queue_scope.declare("is_empty", "is_empty",
queue_is_empty_type, None, "extern") queue_is_empty_type, None, "extern")
queue_is_empty_entry.is_cfunction = 1 queue_is_empty_entry.is_cfunction = 1
...@@ -654,21 +649,21 @@ def inject_cypclass_refcount_macros(): ...@@ -654,21 +649,21 @@ def inject_cypclass_refcount_macros():
incref_type = PyrexTypes.CFuncType( incref_type = PyrexTypes.CFuncType(
PyrexTypes.c_void_type, PyrexTypes.c_void_type,
[ [
PyrexTypes.CFuncTypeArg("obj", PyrexTypes.const_cy_object_type, None) PyrexTypes.CFuncTypeArg("obj", PyrexTypes.cy_object_type, None)
], ],
nogil = 1) nogil = 1)
decref_type = PyrexTypes.CFuncType( decref_type = PyrexTypes.CFuncType(
PyrexTypes.c_void_type, PyrexTypes.c_void_type,
[ [
PyrexTypes.CFuncTypeArg("obj", PyrexTypes.CReferenceType(PyrexTypes.const_cy_object_type), None) PyrexTypes.CFuncTypeArg("obj", PyrexTypes.CReferenceType(PyrexTypes.cy_object_type), None)
], ],
nogil = 1) nogil = 1)
getref_type = PyrexTypes.CFuncType( getref_type = PyrexTypes.CFuncType(
PyrexTypes.c_int_type, PyrexTypes.c_int_type,
[ [
PyrexTypes.CFuncTypeArg("obj", PyrexTypes.const_cy_object_type, None) PyrexTypes.CFuncTypeArg("obj", PyrexTypes.cy_object_type, None)
], ],
nogil = 1) nogil = 1)
...@@ -679,7 +674,7 @@ def inject_cypclass_lock_macros(): ...@@ -679,7 +674,7 @@ def inject_cypclass_lock_macros():
blocking_macro_type = PyrexTypes.CFuncType( blocking_macro_type = PyrexTypes.CFuncType(
PyrexTypes.c_void_type, PyrexTypes.c_void_type,
[ [
PyrexTypes.CFuncTypeArg("obj", PyrexTypes.const_cy_object_type, None) PyrexTypes.CFuncTypeArg("obj", PyrexTypes.cy_object_type, None)
], ],
nogil = 1) nogil = 1)
for macro in ("Cy_RLOCK", "Cy_WLOCK", "Cy_UNWLOCK", "Cy_UNRLOCK"): for macro in ("Cy_RLOCK", "Cy_WLOCK", "Cy_UNWLOCK", "Cy_UNRLOCK"):
...@@ -687,7 +682,7 @@ def inject_cypclass_lock_macros(): ...@@ -687,7 +682,7 @@ def inject_cypclass_lock_macros():
nonblocking_macro_type = PyrexTypes.CFuncType(PyrexTypes.c_int_type, nonblocking_macro_type = PyrexTypes.CFuncType(PyrexTypes.c_int_type,
[ [
PyrexTypes.CFuncTypeArg("obj", PyrexTypes.const_cy_object_type, None) PyrexTypes.CFuncTypeArg("obj", PyrexTypes.cy_object_type, None)
], ],
nogil = 1) nogil = 1)
for macro in ("Cy_TRYRLOCK", "Cy_TRYWLOCK"): for macro in ("Cy_TRYRLOCK", "Cy_TRYWLOCK"):
...@@ -698,7 +693,7 @@ def inject_cypclass_typecheck_functions(): ...@@ -698,7 +693,7 @@ def inject_cypclass_typecheck_functions():
isinstanceof_type = PyrexTypes.CFuncType( isinstanceof_type = PyrexTypes.CFuncType(
PyrexTypes.c_int_type, PyrexTypes.c_int_type,
[ [
PyrexTypes.CFuncTypeArg("obj", PyrexTypes.const_cy_object_type, None), PyrexTypes.CFuncTypeArg("obj", PyrexTypes.cy_object_type, None),
PyrexTypes.CFuncTypeArg("type", template_placeholder_type, None) PyrexTypes.CFuncTypeArg("type", template_placeholder_type, None)
], ],
nogil = 1, nogil = 1,
......
...@@ -2894,7 +2894,7 @@ class CppIteratorNode(ExprNode): ...@@ -2894,7 +2894,7 @@ class CppIteratorNode(ExprNode):
sequence_type = self.sequence.type sequence_type = self.sequence.type
if sequence_type.is_ptr: if sequence_type.is_ptr:
sequence_type = sequence_type.base_type sequence_type = sequence_type.base_type
if sequence_type.is_const or sequence_type.is_const_cyp_class: if sequence_type.is_const:
begin = sequence_type.scope.lookup("const_begin") begin = sequence_type.scope.lookup("const_begin")
end = sequence_type.scope.lookup("const_end") end = sequence_type.scope.lookup("const_end")
if not begin or begin.cname != "begin": if not begin or begin.cname != "begin":
...@@ -13429,9 +13429,6 @@ class PrimaryCmpNode(ExprNode, CmpNode): ...@@ -13429,9 +13429,6 @@ class PrimaryCmpNode(ExprNode, CmpNode):
common_type = PyrexTypes.independent_spanning_type(type1, type2) common_type = PyrexTypes.independent_spanning_type(type1, type2)
if common_type.is_error: if common_type.is_error:
common_type = PyrexTypes.cy_object_type common_type = PyrexTypes.cy_object_type
if type1.is_const_cyp_class or type2.is_const_cyp_class:
if not common_type.is_const_cyp_class:
common_type = PyrexTypes.cyp_class_const_type(common_type)
# do not analyse the TypecastNode # do not analyse the TypecastNode
# to ensure a simple pointer cast is used and not a user-defined conversion method # to ensure a simple pointer cast is used and not a user-defined conversion method
self.operand1 = TypecastNode(self.operand1.pos, operand=self.operand1, type=common_type) self.operand1 = TypecastNode(self.operand1.pos, operand=self.operand1, type=common_type)
......
...@@ -653,8 +653,6 @@ class CFuncDeclaratorNode(CDeclaratorNode): ...@@ -653,8 +653,6 @@ class CFuncDeclaratorNode(CDeclaratorNode):
directive_locals = {} directive_locals = {}
if nonempty: if nonempty:
nonempty -= 1 nonempty -= 1
if self.is_const_method and env.is_cyp_class_scope:
error(self.pos, "The form 'f(self, ...) const' is not allowed for cypclass methods. Use 'f(const self, ...)' instead")
func_type_args = [] func_type_args = []
for i, arg_node in enumerate(self.args): for i, arg_node in enumerate(self.args):
name_declarator, type = arg_node.analyse( name_declarator, type = arg_node.analyse(
...@@ -682,12 +680,8 @@ class CFuncDeclaratorNode(CDeclaratorNode): ...@@ -682,12 +680,8 @@ class CFuncDeclaratorNode(CDeclaratorNode):
type = env.parent_type type = env.parent_type
elif i == 0 and env.is_cyp_class_scope and 'staticmethod' not in env.directives and self.declared_name() != "alloc": elif i == 0 and env.is_cyp_class_scope and 'staticmethod' not in env.directives and self.declared_name() != "alloc":
if self.declared_name() != "__new__": if self.declared_name() != "__new__":
# Accept 'f(const self, ...)' syntax as equivalent to 'f(self, ...) const'
unqualified_type = type
if type.is_const_cyp_class:
self.is_const_method = True
unqualified_type = type.const_base_type
# Accept 'f(<qualifier> self, ...) syntax' # Accept 'f(<qualifier> self, ...) syntax'
unqualified_type = type
if type.is_qualified_cyp_class: if type.is_qualified_cyp_class:
self.self_qualifier = type.qualifier self.self_qualifier = type.qualifier
unqualified_type = type.qual_base_type unqualified_type = type.qual_base_type
...@@ -1355,10 +1349,11 @@ class CConstOrVolatileTypeNode(CBaseTypeNode): ...@@ -1355,10 +1349,11 @@ class CConstOrVolatileTypeNode(CBaseTypeNode):
error(self.pos, error(self.pos,
"Const/volatile base type cannot be a Python object") "Const/volatile base type cannot be a Python object")
if base.is_cyp_class: if base.is_cyp_class:
if not self.is_const or self.is_volatile: if self.is_const:
error(self.pos, "Cypclass doesn't support 'volatile' yet") error(self.pos, "Cypclass reference cannot be 'const'")
return base elif self.is_volatile:
return PyrexTypes.cyp_class_const_type(base) error(self.pos, "Cypclass reference cannot be 'volatile'")
return base
return PyrexTypes.c_const_or_volatile_type(base, self.is_const, self.is_volatile) return PyrexTypes.c_const_or_volatile_type(base, self.is_const, self.is_volatile)
......
...@@ -3383,7 +3383,7 @@ def p_c_func_or_var_declaration(s, pos, ctx): ...@@ -3383,7 +3383,7 @@ def p_c_func_or_var_declaration(s, pos, ctx):
s.next() s.next()
p_test(s) # Keep going, but ignore result. p_test(s) # Keep going, but ignore result.
if s.sy == ':': if s.sy == ':':
if ctx.level not in ('module', 'c_class', 'module_pxd', 'c_class_pxd', 'cpp_class') and not ctx.templates: if ctx.level not in ('module', 'c_class', 'module_pxd', 'c_class_pxd', 'cpp_class', 'cyp_class') and not ctx.templates:
s.error("C function definition not allowed here") s.error("C function definition not allowed here")
doc, suite = p_suite_with_docstring(s, Ctx(level='function')) doc, suite = p_suite_with_docstring(s, Ctx(level='function'))
if 'mutable' in modifiers: if 'mutable' in modifiers:
...@@ -3877,7 +3877,8 @@ def p_cpp_class_definition(s, pos, ctx): ...@@ -3877,7 +3877,8 @@ def p_cpp_class_definition(s, pos, ctx):
# so why not on the cppclass itself ? # so why not on the cppclass itself ?
p_doc_string(s) p_doc_string(s)
attributes = [] attributes = []
body_ctx = Ctx(visibility = ctx.visibility, level='cpp_class', nogil=nogil or ctx.nogil) body_level = 'cyp_class' if cypclass else 'cpp_class'
body_ctx = Ctx(visibility = ctx.visibility, level=body_level, nogil=nogil or ctx.nogil)
body_ctx.templates = template_names body_ctx.templates = template_names
while s.sy != 'DEDENT': while s.sy != 'DEDENT':
if s.sy != 'pass': if s.sy != 'pass':
......
...@@ -258,7 +258,6 @@ class PyrexType(BaseType): ...@@ -258,7 +258,6 @@ class PyrexType(BaseType):
is_struct_or_union = 0 is_struct_or_union = 0
is_cpp_class = 0 is_cpp_class = 0
is_cyp_class = 0 is_cyp_class = 0
is_const_cyp_class = 0
is_qualified_cyp_class = 0 is_qualified_cyp_class = 0
is_cpp_string = 0 is_cpp_string = 0
is_struct = 0 is_struct = 0
...@@ -4671,13 +4670,11 @@ class CypClassType(CppClassType): ...@@ -4671,13 +4670,11 @@ class CypClassType(CppClassType):
return "dynamic_cast<%s>(%s)" % (self.declaration_code(''), expr_code) return "dynamic_cast<%s>(%s)" % (self.declaration_code(''), expr_code)
def same_as_resolved_type(self, other_type): def same_as_resolved_type(self, other_type):
if other_type.is_const_cyp_class: if other_type.is_qualified_cyp_class:
return 0 return 0
return super(CypClassType, self).same_as_resolved_type(other_type) return super(CypClassType, self).same_as_resolved_type(other_type)
def assignable_from_resolved_type(self, other_type): def assignable_from_resolved_type(self, other_type):
if other_type.is_const_cyp_class:
return 0
if other_type.is_qualified_cyp_class and other_type.qualifier != 'iso~': if other_type.is_qualified_cyp_class and other_type.qualifier != 'iso~':
return 0 return 0
if other_type.is_ptr and other_type.base_type.is_cpp_class and other_type.base_type.is_subclass(self) or other_type.is_null_ptr: if other_type.is_ptr and other_type.base_type.is_cpp_class and other_type.base_type.is_subclass(self) or other_type.is_null_ptr:
...@@ -4685,16 +4682,12 @@ class CypClassType(CppClassType): ...@@ -4685,16 +4682,12 @@ class CypClassType(CppClassType):
return super(CypClassType, self).assignable_from_resolved_type(other_type) return super(CypClassType, self).assignable_from_resolved_type(other_type)
def is_subclass(self, other_type): def is_subclass(self, other_type):
if other_type.is_const_cyp_class: if other_type.is_qualified_cyp_class:
other_type = other_type.const_base_type
elif other_type.is_qualified_cyp_class:
other_type = other_type.qual_base_type other_type = other_type.qual_base_type
return super(CypClassType, self).is_subclass(other_type) return super(CypClassType, self).is_subclass(other_type)
def subclass_dist(self, super_type): def subclass_dist(self, super_type):
if super_type.is_const_cyp_class: if super_type.is_qualified_cyp_class:
super_type = super_type.const_base_type
elif super_type.is_qualified_cyp_class:
super_type = super_type.qual_base_type super_type = super_type.qual_base_type
return super(CypClassType, self).subclass_dist(super_type) return super(CypClassType, self).subclass_dist(super_type)
...@@ -4753,94 +4746,6 @@ class CypClassType(CppClassType): ...@@ -4753,94 +4746,6 @@ class CypClassType(CppClassType):
raise NotImplementedError("Cy_XDECREF_SET is not defined for decrementing a group of cyobjects") raise NotImplementedError("Cy_XDECREF_SET is not defined for decrementing a group of cyobjects")
class ConstCypclassType(BaseType):
"A const cypclass"
subtypes = ['const_base_type']
is_const_cyp_class = 1
def __init__(self, base_type):
assert base_type.is_cyp_class
self.const_base_type = base_type
if base_type.has_attributes and base_type.scope is not None:
from .Symtab import CConstOrVolatileScope
self.scope = CConstOrVolatileScope(base_type.scope, is_const = 1, is_volatile = 0)
def __repr__(self):
return "<ConstCypclassType %s%r>" % self.const_base_type
def __str__(self):
return self.declaration_code("", for_display=1)
def declaration_code(self, entity_code, for_display = 0, dll_linkage = None, pyrex = 0, template_params = None, deref = 0):
return "const %s" % self.const_base_type.declaration_code(entity_code, for_display, dll_linkage, pyrex, template_params, deref)
def empty_declaration_code(self):
if self._empty_declaration is None:
self._empty_declaration = "const %s" % self.const_base_type.empty_declaration_code()
return self._empty_declaration
def cast_code(self, expr_code):
return "((%s)%s)" % (self.declaration_code(''), expr_code)
def dynamic_cast_code(self, expr_code):
return "dynamic_cast<%s>(%s)" % (self.declaration_code(''), expr_code)
def resolve(self):
base_type = self.const_base_type.resolve()
if base_type == self.const_base_type:
return self
return ConstCypclassType(base_type)
def specialize(self, values):
base_type = self.const_base_type.specialize(values)
if base_type == self.const_base_type:
return self
return ConstCypclassType(base_type)
def as_argument_type(self):
return self
def as_returned_type(self):
return self
def deduce_template_params(self, actual):
return self.const_base_type.deduce_template_params(actual)
def can_coerce_to_pyobject(self, env):
return self.const_base_type.can_coerce_to_pyobject(env)
def can_coerce_from_pyobject(self, env):
return self.const_base_type.can_coerce_from_pyobject(env)
def create_to_py_utility_code(self, env):
if self.const_base_type.create_to_py_utility_code(env):
self.to_py_function = self.const_base_type.to_py_function
return True
def assignable_from(self, src_type):
return self.assignable_from_resolved_type(src_type.resolve())
def assignable_from_resolved_type(self, src_type):
if src_type.is_const_cyp_class:
src_type = src_type.const_base_type
return self.const_base_type.assignable_from_resolved_type(src_type)
def same_as(self, other_type):
if not other_type.is_const_cyp_class:
return 0
return self.same_as_resolved_type(other_type.resolve())
def same_as_resolved_type(self, other_type):
if other_type.is_const_cyp_class:
return self.const_base_type.same_as_resolved_type(other_type.const_base_type)
return 0
def __getattr__(self, name):
return getattr(self.const_base_type, name)
class QualifiedCypclassType(BaseType): class QualifiedCypclassType(BaseType):
"A qualified cypclass reference" "A qualified cypclass reference"
...@@ -5252,7 +5157,6 @@ unspecified_type = UnspecifiedType() ...@@ -5252,7 +5157,6 @@ unspecified_type = UnspecifiedType()
py_object_type = PyObjectType() py_object_type = PyObjectType()
cy_object_type = CypClassType('cyobject', None, "CyObject", None) cy_object_type = CypClassType('cyobject', None, "CyObject", None)
const_cy_object_type = ConstCypclassType(cy_object_type)
c_void_type = CVoidType() c_void_type = CVoidType()
...@@ -5881,13 +5785,6 @@ def c_const_or_volatile_type(base_type, is_const, is_volatile): ...@@ -5881,13 +5785,6 @@ def c_const_or_volatile_type(base_type, is_const, is_volatile):
else: else:
return CConstOrVolatileType(base_type, is_const, is_volatile) return CConstOrVolatileType(base_type, is_const, is_volatile)
def cyp_class_const_type(base_type):
# Construct a Cypclass const type.
if base_type is error_type:
return error_type
else:
return ConstCypclassType(base_type)
def cyp_class_qualified_type(base_type, qualifier): def cyp_class_qualified_type(base_type, qualifier):
# Construct a qualified cypclass type. # Construct a qualified cypclass type.
if base_type is error_type: if base_type is error_type:
...@@ -5929,10 +5826,6 @@ def ptr_to_subtype_of(type1, type2): ...@@ -5929,10 +5826,6 @@ def ptr_to_subtype_of(type1, type2):
def ptr_to_same_without_cv(type1, type2): def ptr_to_same_without_cv(type1, type2):
if type1.is_cyp_class and type2.is_cyp_class: if type1.is_cyp_class and type2.is_cyp_class:
if type1.is_const_cyp_class:
type1 = type1.const_base_type
if type2.is_const_cyp_class:
type2 = type2.const_base_type
return same_type(type1, type2) return same_type(type1, type2)
elif type1.is_ptr and type2.is_ptr: elif type1.is_ptr and type2.is_ptr:
type1 = type1.base_type type1 = type1.base_type
......
...@@ -564,12 +564,6 @@ class Scope(object): ...@@ -564,12 +564,6 @@ class Scope(object):
cpp_override_allowed = True cpp_override_allowed = True
continue continue
# allow const overloads
if alt_type.is_const_method != type.is_const_method:
error(pos, "Cypclass method const-overloads another method: not supported yet")
cpp_override_allowed = True
continue
elif alt_entry.is_inherited: elif alt_entry.is_inherited:
# if the arguments are compatible, then the signatures need to actually be the # if the arguments are compatible, then the signatures need to actually be the
......
...@@ -125,26 +125,26 @@ cdef cypclass cypdict[K, V]: ...@@ -125,26 +125,26 @@ cdef cypclass cypdict[K, V]:
ctypedef V value_type ctypedef V value_type
ctypedef pair[key_type, value_type] item_type ctypedef pair[key_type, value_type] item_type
ctypedef vector[item_type].size_type size_type ctypedef vector[item_type].size_type size_type
ctypedef dict_key_iterator_t[const cypdict[K, V], vector[item_type].const_iterator, key_type] iterator ctypedef dict_key_iterator_t[cypdict[K, V], vector[item_type].const_iterator, key_type] iterator
ctypedef dict_keys_view_t[const cypdict[K, V], vector[item_type].const_iterator, key_type] keys_view ctypedef dict_keys_view_t[cypdict[K, V], vector[item_type].const_iterator, key_type] keys_view
ctypedef dict_values_view_t[const cypdict[K, V], vector[item_type].const_iterator, value_type] values_view ctypedef dict_values_view_t[cypdict[K, V], vector[item_type].const_iterator, value_type] values_view
ctypedef dict_items_view_t[const cypdict[K, V], vector[item_type].const_iterator, item_type] items_view ctypedef dict_items_view_t[cypdict[K, V], vector[item_type].const_iterator, item_type] items_view
vector[item_type] _items vector[item_type] _items
unordered_map[key_type, size_type] _indices unordered_map[key_type, size_type] _indices
mutable atomic[int] _active_iterators atomic[int] _active_iterators
__init__(self): __init__(self):
self._active_iterators.store(0) self._active_iterators.store(0)
V __getitem__(const self, const key_type key) except ~: V __getitem__(self, key_type key) except ~:
it = self._indices.const_find(key) it = self._indices.const_find(key)
if it != self._indices.end(): if it != self._indices.end():
return self._items[dereference(it).second].second return self._items[dereference(it).second].second
with gil: with gil:
raise KeyError("Getting nonexistent item") raise KeyError("Getting nonexistent item")
void __setitem__(self, const key_type key, const value_type value) except ~: void __setitem__(self, key_type key, value_type value) except ~:
it = self._indices.find(key) it = self._indices.find(key)
if it != self._indices.end(): if it != self._indices.end():
index = dereference(it).second index = dereference(it).second
...@@ -156,7 +156,7 @@ cdef cypclass cypdict[K, V]: ...@@ -156,7 +156,7 @@ cdef cypclass cypdict[K, V]:
with gil: with gil:
raise RuntimeError("Modifying a dictionary with active iterators") raise RuntimeError("Modifying a dictionary with active iterators")
void __delitem__(self, const key_type key) except ~: void __delitem__(self, key_type key) except ~:
it = self._indices.find(key) it = self._indices.find(key)
if it == self._indices.end(): if it == self._indices.end():
with gil: with gil:
...@@ -170,7 +170,7 @@ cdef cypclass cypdict[K, V]: ...@@ -170,7 +170,7 @@ cdef cypclass cypdict[K, V]:
self._items[index] = self._items[self._indices.size() - 1] self._items[index] = self._items[self._indices.size() - 1]
self._items.pop_back() self._items.pop_back()
void update(self, const cypdict[K, V] other) except ~: void update(self, cypdict[K, V] other) except ~:
for item in other.items(): for item in other.items():
self[item.first] = item.second self[item.first] = item.second
...@@ -182,23 +182,23 @@ cdef cypclass cypdict[K, V]: ...@@ -182,23 +182,23 @@ cdef cypclass cypdict[K, V]:
with gil: with gil:
raise RuntimeError("Modifying a dictionary with active iterators") raise RuntimeError("Modifying a dictionary with active iterators")
iterator begin(const self): iterator begin(self):
return iterator(self._items.const_begin(), self) return iterator(self._items.const_begin(), self)
vector[item_type].const_iterator end(const self): vector[item_type].const_iterator end(self):
return self._items.const_end() return self._items.const_end()
size_type __len__(const self): size_type __len__(self):
return self._items.size() return self._items.size()
bint __contains__(const self, const key_type key): bint __contains__(self, key_type key):
return self._indices.count(key) return self._indices.count(key)
keys_view keys(const self): keys_view keys(self):
return keys_view(self) return keys_view(self)
values_view values(const self): values_view values(self):
return values_view(self) return values_view(self)
items_view items(const self): items_view items(self):
return items_view(self) return items_view(self)
...@@ -18,7 +18,7 @@ cdef extern from * nogil: ...@@ -18,7 +18,7 @@ cdef extern from * nogil:
cdef cppclass list_iterator_t[list_t, base_iterator_t, reference_t]: cdef cppclass list_iterator_t[list_t, base_iterator_t, reference_t]:
list_iterator_t() list_iterator_t()
list_iterator_t(base_iterator_t) list_iterator_t(base_iterator_t)
list_iterator_t(base_iterator_t, const list_t) list_iterator_t(base_iterator_t, list_t)
reference_t operator*() reference_t operator*()
list_iterator_t operator++() list_iterator_t operator++()
bint operator!=(base_iterator_t) bint operator!=(base_iterator_t)
...@@ -26,22 +26,22 @@ cdef extern from * nogil: ...@@ -26,22 +26,22 @@ cdef extern from * nogil:
cdef cypclass cyplist[V]: cdef cypclass cyplist[V]:
ctypedef V value_type ctypedef V value_type
ctypedef vector[value_type].size_type size_type ctypedef vector[value_type].size_type size_type
ctypedef list_iterator_t[const cyplist[V], vector[value_type].const_iterator, value_type] iterator ctypedef list_iterator_t[cyplist[V], vector[value_type].const_iterator, value_type] iterator
vector[value_type] _elements vector[value_type] _elements
mutable atomic[int] _active_iterators atomic[int] _active_iterators
__init__(self): __init__(self):
self._active_iterators.store(0) self._active_iterators.store(0)
V __getitem__(const self, const size_type index) except ~: V __getitem__(self, size_type index) except ~:
if index < self._elements.size(): if index < self._elements.size():
return self._elements[index] return self._elements[index]
else: else:
with gil: with gil:
raise IndexError("Getting list index out of range") raise IndexError("Getting list index out of range")
void __setitem__(self, size_type index, const value_type value) except ~: void __setitem__(self, size_type index, value_type value) except ~:
if index < self._elements.size(): if index < self._elements.size():
self._elements[index] = value self._elements[index] = value
else: else:
...@@ -60,14 +60,14 @@ cdef cypclass cyplist[V]: ...@@ -60,14 +60,14 @@ cdef cypclass cyplist[V]:
with gil: with gil:
raise IndexError("Deleting list index out of range") raise IndexError("Deleting list index out of range")
void append(self, const value_type value) except ~: void append(self, value_type value) except ~:
if self._active_iterators == 0: if self._active_iterators == 0:
self._elements.push_back(value) self._elements.push_back(value)
else: else:
with gil: with gil:
raise RuntimeError("Modifying a list with active iterators") raise RuntimeError("Modifying a list with active iterators")
void insert(self, size_type index, const value_type value) except ~: void insert(self, size_type index, value_type value) except ~:
if self._active_iterators == 0: if self._active_iterators == 0:
if index <= self._elements.size(): if index <= self._elements.size():
it = self._elements.begin() + index it = self._elements.begin() + index
...@@ -86,14 +86,14 @@ cdef cypclass cyplist[V]: ...@@ -86,14 +86,14 @@ cdef cypclass cyplist[V]:
with gil: with gil:
raise RuntimeError("Modifying a list with active iterators") raise RuntimeError("Modifying a list with active iterators")
cyplist[V] __add__(const self, const cyplist[V] other): cyplist[V] __add__(self, cyplist[V] other):
result = cyplist[V]() result = cyplist[V]()
result._elements.reserve(self._elements.size() + other._elements.size()) result._elements.reserve(self._elements.size() + other._elements.size())
result._elements.insert(result._elements.end(), self._elements.const_begin(), self._elements.const_end()) result._elements.insert(result._elements.end(), self._elements.const_begin(), self._elements.const_end())
result._elements.insert(result._elements.end(), other._elements.const_begin(), other._elements.const_end()) result._elements.insert(result._elements.end(), other._elements.const_begin(), other._elements.const_end())
return result return result
cyplist[V] __iadd__(self, const cyplist[V] other): cyplist[V] __iadd__(self, cyplist[V] other):
if self._active_iterators == 0: if self._active_iterators == 0:
self._elements.insert(self._elements.end(), other._elements.const_begin(), other._elements.const_end()) self._elements.insert(self._elements.end(), other._elements.const_begin(), other._elements.const_end())
return self return self
...@@ -101,7 +101,7 @@ cdef cypclass cyplist[V]: ...@@ -101,7 +101,7 @@ cdef cypclass cyplist[V]:
with gil: with gil:
raise RuntimeError("Modifying a list with active iterators") raise RuntimeError("Modifying a list with active iterators")
cyplist[V] __mul__(const self, size_type n): cyplist[V] __mul__(self, size_type n):
result = cyplist[V]() result = cyplist[V]()
result._elements.reserve(self._elements.size() * n) result._elements.reserve(self._elements.size() * n)
for i in range(n): for i in range(n):
...@@ -125,16 +125,16 @@ cdef cypclass cyplist[V]: ...@@ -125,16 +125,16 @@ cdef cypclass cyplist[V]:
with gil: with gil:
raise RuntimeError("Modifying a list with active iterators") raise RuntimeError("Modifying a list with active iterators")
iterator begin(const self): iterator begin(self):
return iterator(self._elements.const_begin(), self) return iterator(self._elements.const_begin(), self)
vector[value_type].const_iterator end(const self): vector[value_type].const_iterator end(self):
return self._elements.const_end() return self._elements.const_end()
size_type __len__(const self): size_type __len__(self):
return self._elements.size() return self._elements.size()
bint __contains__(const self, const value_type value): bint __contains__(self, value_type value):
for v in self._elements: for v in self._elements:
if value is v: if value is v:
return 1 return 1
......
...@@ -19,7 +19,7 @@ cdef extern from * nogil: ...@@ -19,7 +19,7 @@ cdef extern from * nogil:
cdef cppclass set_iterator_t[set_t, base_iterator_t, reference_t]: cdef cppclass set_iterator_t[set_t, base_iterator_t, reference_t]:
set_iterator_t() set_iterator_t()
set_iterator_t(base_iterator_t) set_iterator_t(base_iterator_t)
set_iterator_t(base_iterator_t, const set_t) set_iterator_t(base_iterator_t, set_t)
reference_t operator*() reference_t operator*()
set_iterator_t operator++() set_iterator_t operator++()
bint operator!=(base_iterator_t) bint operator!=(base_iterator_t)
...@@ -27,24 +27,24 @@ cdef extern from * nogil: ...@@ -27,24 +27,24 @@ cdef extern from * nogil:
cdef cypclass cypset[V]: cdef cypclass cypset[V]:
ctypedef V value_type ctypedef V value_type
ctypedef size_t size_type ctypedef size_t size_type
ctypedef set_iterator_t[const cypset[V], unordered_set[value_type].const_iterator, value_type] iterator ctypedef set_iterator_t[cypset[V], unordered_set[value_type].const_iterator, value_type] iterator
unordered_set[value_type] _elements unordered_set[value_type] _elements
mutable atomic[int] _active_iterators atomic[int] _active_iterators
__init__(self): __init__(self):
self._active_iterators.store(0) self._active_iterators.store(0)
# set elementary operations # set elementary operations
void add(self, const value_type value) except ~: void add(self, value_type value) except ~:
if self._active_iterators == 0: if self._active_iterators == 0:
self._elements.insert(value) self._elements.insert(value)
else: else:
with gil: with gil:
raise RuntimeError("Modifying a set with active iterators") raise RuntimeError("Modifying a set with active iterators")
void remove(self, const value_type value) except ~: void remove(self, value_type value) except ~:
if self._active_iterators == 0: if self._active_iterators == 0:
if self._elements.erase(value) == 0: if self._elements.erase(value) == 0:
with gil: with gil:
...@@ -53,7 +53,7 @@ cdef cypclass cypset[V]: ...@@ -53,7 +53,7 @@ cdef cypclass cypset[V]:
with gil: with gil:
raise RuntimeError("Modifying a set with active iterators") raise RuntimeError("Modifying a set with active iterators")
void discard(self, const value_type value) except ~: void discard(self, value_type value) except ~:
if self._active_iterators == 0: if self._active_iterators == 0:
self._elements.erase(value) self._elements.erase(value)
else: else:
...@@ -79,15 +79,15 @@ cdef cypclass cypset[V]: ...@@ -79,15 +79,15 @@ cdef cypclass cypset[V]:
# inspection operations # inspection operations
size_type __len__(const self): size_type __len__(self):
return self._elements.size() return self._elements.size()
bint __contains__(const self, const value_type value): bint __contains__(self, value_type value):
return self._elements.count(value) return self._elements.count(value)
bint isdisjoint(const self, const cypset[V] other): bint isdisjoint(self, cypset[V] other):
cdef const cypset[V] smallest cdef cypset[V] smallest
cdef const cypset[V] greatest cdef cypset[V] greatest
if self._elements.size() < other._elements.size(): if self._elements.size() < other._elements.size():
smallest = self smallest = self
greatest = other greatest = other
...@@ -101,7 +101,7 @@ cdef cypclass cypset[V]: ...@@ -101,7 +101,7 @@ cdef cypclass cypset[V]:
# set comparisons # set comparisons
bint __eq__(const self, const cypset[V] other): bint __eq__(self, cypset[V] other):
if self._elements.size() != other._elements.size(): if self._elements.size() != other._elements.size():
return 0 return 0
for value in self._elements: for value in self._elements:
...@@ -109,7 +109,7 @@ cdef cypclass cypset[V]: ...@@ -109,7 +109,7 @@ cdef cypclass cypset[V]:
return 0 return 0
return 1 return 1
bint __ne__(const self, const cypset[V] other): bint __ne__(self, cypset[V] other):
if self._elements.size() != other._elements.size(): if self._elements.size() != other._elements.size():
return 1 return 1
for value in self._elements: for value in self._elements:
...@@ -117,7 +117,7 @@ cdef cypclass cypset[V]: ...@@ -117,7 +117,7 @@ cdef cypclass cypset[V]:
return 1 return 1
return 0 return 0
bint __le__(const self, const cypset[V] other): bint __le__(self, cypset[V] other):
if self._elements.size() > other._elements.size(): if self._elements.size() > other._elements.size():
return 0 return 0
for value in self._elements: for value in self._elements:
...@@ -125,13 +125,13 @@ cdef cypclass cypset[V]: ...@@ -125,13 +125,13 @@ cdef cypclass cypset[V]:
return 0 return 0
return 1 return 1
bint __lt__(const self, const cypset[V] other): bint __lt__(self, cypset[V] other):
return self <= other and self._elements.size() < other._elements.size() return self <= other and self._elements.size() < other._elements.size()
bint issubset(const self, const cypset[V] other): bint issubset(self, cypset[V] other):
return self <= other return self <= other
bint __ge__(const self, const cypset[V] other): bint __ge__(self, cypset[V] other):
if self._elements.size() < other._elements.size(): if self._elements.size() < other._elements.size():
return 0 return 0
for value in other._elements: for value in other._elements:
...@@ -139,27 +139,27 @@ cdef cypclass cypset[V]: ...@@ -139,27 +139,27 @@ cdef cypclass cypset[V]:
return 0 return 0
return 1 return 1
bint __gt__(const self, const cypset[V] other): bint __gt__(self, cypset[V] other):
return self >= other and self._elements.size() > other._elements.size() return self >= other and self._elements.size() > other._elements.size()
bint issuperset(const self, const cypset[V] other): bint issuperset(self, cypset[V] other):
return self >= other return self >= other
# set non-modifying operations # set non-modifying operations
cypset[V] __or__(const self, const cypset[V] other): cypset[V] __or__(self, cypset[V] other):
result = cypset[V]() result = cypset[V]()
result._elements.insert(self._elements.const_begin(), self._elements.const_end()) result._elements.insert(self._elements.const_begin(), self._elements.const_end())
result._elements.insert(other._elements.const_begin(), other._elements.const_end()) result._elements.insert(other._elements.const_begin(), other._elements.const_end())
return result return result
cypset[V] union "set_union"(const self, const cypset[V] other): cypset[V] union "set_union"(self, cypset[V] other):
return self | other return self | other
cypset[V] __and__(const self, const cypset[V] other): cypset[V] __and__(self, cypset[V] other):
cdef const cypset[V] smallest cdef cypset[V] smallest
cdef const cypset[V] greatest cdef cypset[V] greatest
if self._elements.size() < other._elements.size(): if self._elements.size() < other._elements.size():
smallest = self smallest = self
greatest = other greatest = other
...@@ -172,20 +172,20 @@ cdef cypclass cypset[V]: ...@@ -172,20 +172,20 @@ cdef cypclass cypset[V]:
result._elements.insert(value) result._elements.insert(value)
return result return result
cypset[V] intersection(const self, const cypset[V] other): cypset[V] intersection(self, cypset[V] other):
return self & other return self & other
cypset[V] __sub__(const self, const cypset[V] other): cypset[V] __sub__(self, cypset[V] other):
result = cypset[V]() result = cypset[V]()
for value in self._elements: for value in self._elements:
if other._elements.count(value) == 0: if other._elements.count(value) == 0:
result._elements.insert(value) result._elements.insert(value)
return result return result
cypset[V] difference(const self, const cypset[V] other): cypset[V] difference(self, cypset[V] other):
return self - other return self - other
cypset[V] __xor__(const self, const cypset[V] other): cypset[V] __xor__(self, cypset[V] other):
result = cypset[V]() result = cypset[V]()
result._elements = other._elements result._elements = other._elements
for value in self._elements: for value in self._elements:
...@@ -196,13 +196,13 @@ cdef cypclass cypset[V]: ...@@ -196,13 +196,13 @@ cdef cypclass cypset[V]:
result._elements.insert(value) result._elements.insert(value)
return result return result
cypset[V] symmetric_difference(const self, const cypset[V] other): cypset[V] symmetric_difference(self, cypset[V] other):
return self ^ other return self ^ other
# set in-place (modifying) operations # set in-place (modifying) operations
cypset[V] __ior__(self, const cypset[V] other) except ~: cypset[V] __ior__(self, cypset[V] other) except ~:
if self._active_iterators == 0: if self._active_iterators == 0:
self._elements.insert(other._elements.const_begin(), other._elements.end()) self._elements.insert(other._elements.const_begin(), other._elements.end())
return self return self
...@@ -210,11 +210,11 @@ cdef cypclass cypset[V]: ...@@ -210,11 +210,11 @@ cdef cypclass cypset[V]:
with gil: with gil:
raise RuntimeError("Modifying a set with active iterators") raise RuntimeError("Modifying a set with active iterators")
cypset[V] update(self, const cypset[V] other) except ~: cypset[V] update(self, cypset[V] other) except ~:
self |= other self |= other
return self return self
cypset[V] __iand__(self, const cypset[V] other) except ~: cypset[V] __iand__(self, cypset[V] other) except ~:
if self._active_iterators == 0: if self._active_iterators == 0:
it = self._elements.begin() it = self._elements.begin()
end = self._elements.end() end = self._elements.end()
...@@ -229,11 +229,11 @@ cdef cypclass cypset[V]: ...@@ -229,11 +229,11 @@ cdef cypclass cypset[V]:
with gil: with gil:
raise RuntimeError("Modifying a set with active iterators") raise RuntimeError("Modifying a set with active iterators")
cypset[V] intersection_update(self, const cypset[V] other) except ~: cypset[V] intersection_update(self, cypset[V] other) except ~:
self &= other self &= other
return self return self
cypset[V] __isub__(self, const cypset[V] other) except ~: cypset[V] __isub__(self, cypset[V] other) except ~:
if self._active_iterators == 0: if self._active_iterators == 0:
for value in other._elements: for value in other._elements:
self._elements.erase(value) self._elements.erase(value)
...@@ -242,11 +242,11 @@ cdef cypclass cypset[V]: ...@@ -242,11 +242,11 @@ cdef cypclass cypset[V]:
with gil: with gil:
raise RuntimeError("Modifying a set with active iterators") raise RuntimeError("Modifying a set with active iterators")
cypset[V] difference_update(self, const cypset[V] other) except ~: cypset[V] difference_update(self, cypset[V] other) except ~:
self -= other self -= other
return self return self
cypset[V] __ixor__(self, const cypset[V] other) except ~: cypset[V] __ixor__(self, cypset[V] other) except ~:
if self._active_iterators == 0: if self._active_iterators == 0:
for value in other._elements: for value in other._elements:
if self._elements.erase(value) == 0: if self._elements.erase(value) == 0:
...@@ -255,14 +255,14 @@ cdef cypclass cypset[V]: ...@@ -255,14 +255,14 @@ cdef cypclass cypset[V]:
with gil: with gil:
raise RuntimeError("Modifying a set with active iterators") raise RuntimeError("Modifying a set with active iterators")
cypset[V] symmetric_difference_update(self, const cypset[V] other) except ~: cypset[V] symmetric_difference_update(self, cypset[V] other) except ~:
self ^= other self ^= other
return self return self
# iterators # iterators
iterator begin(const self): iterator begin(self):
return iterator(self._elements.const_begin(), self) return iterator(self._elements.const_begin(), self)
unordered_set[value_type].const_iterator end(const self): unordered_set[value_type].const_iterator end(self):
return self._elements.const_end() return self._elements.const_end()
...@@ -364,9 +364,9 @@ ...@@ -364,9 +364,9 @@
struct ActhonResultInterface : public CyObject { struct ActhonResultInterface : public CyObject {
virtual void pushVoidStarResult(void* result) = 0; virtual void pushVoidStarResult(void* result) = 0;
virtual void* getVoidStarResult() const = 0; virtual void* getVoidStarResult() = 0;
virtual void pushIntResult(int result) = 0; virtual void pushIntResult(int result) = 0;
virtual int getIntResult() const = 0; virtual int getIntResult() = 0;
operator int() { return this->getIntResult(); } operator int() { return this->getIntResult(); }
operator void*() { return this->getVoidStarResult(); } operator void*() { return this->getVoidStarResult(); }
}; };
...@@ -374,8 +374,8 @@ ...@@ -374,8 +374,8 @@
struct ActhonMessageInterface; struct ActhonMessageInterface;
struct ActhonSyncInterface : public CyObject { struct ActhonSyncInterface : public CyObject {
virtual int isActivable() const = 0; virtual int isActivable() = 0;
virtual int isCompleted() const = 0; virtual int isCompleted() = 0;
virtual void insertActivity() = 0; virtual void insertActivity() = 0;
virtual void removeActivity() = 0; virtual void removeActivity() = 0;
}; };
...@@ -391,7 +391,7 @@ ...@@ -391,7 +391,7 @@
struct ActhonQueueInterface : public CyObject { struct ActhonQueueInterface : public CyObject {
virtual void push(ActhonMessageInterface* message) = 0; virtual void push(ActhonMessageInterface* message) = 0;
virtual int activate() = 0; virtual int activate() = 0;
virtual int is_empty() const = 0; virtual int is_empty() = 0;
}; };
struct ActhonActivableClass : public CyObject { struct ActhonActivableClass : public CyObject {
......
...@@ -23,7 +23,7 @@ cdef cypclass BasicQueue(ActhonQueueInterface): ...@@ -23,7 +23,7 @@ cdef cypclass BasicQueue(ActhonQueueInterface):
__dealloc__(self): __dealloc__(self):
del self._queue del self._queue
bint is_empty(const self): bint is_empty(self):
return self._queue.empty() return self._queue.empty()
void push(locked self, ActhonMessageInterface message): void push(locked self, ActhonMessageInterface message):
...@@ -58,9 +58,9 @@ cdef cypclass NoneResult(ActhonResultInterface): ...@@ -58,9 +58,9 @@ cdef cypclass NoneResult(ActhonResultInterface):
pass pass
void pushIntResult(self, int result): void pushIntResult(self, int result):
pass pass
void* getVoidStarResult(const self): void* getVoidStarResult(self):
return NULL return NULL
int getIntResult(const self): int getIntResult(self):
return 0 return 0
cdef cypclass WaitResult(ActhonResultInterface): cdef cypclass WaitResult(ActhonResultInterface):
...@@ -89,18 +89,17 @@ cdef cypclass WaitResult(ActhonResultInterface): ...@@ -89,18 +89,17 @@ cdef cypclass WaitResult(ActhonResultInterface):
self.result.int_val = result self.result.int_val = result
sem_post(&self.semaphore) sem_post(&self.semaphore)
result_t _getRawResult(const self): result_t _getRawResult(self):
# We must ensure a result exists, but we can let others access it immediately # We must ensure a result exists, but we can let others access it immediately
# The cast here is a way of const-casting (we're modifying the semaphore in a const method) sem_wait(&self.semaphore)
sem_wait(<sem_t*> &self.semaphore) sem_post(&self.semaphore)
sem_post(<sem_t*> &self.semaphore)
return self.result return self.result
void* getVoidStarResult(const self): void* getVoidStarResult(self):
res = self._getRawResult() res = self._getRawResult()
return res.ptr return res.ptr
int getIntResult(const self): int getIntResult(self):
res = self._getRawResult() res = self._getRawResult()
return res.int_val return res.int_val
...@@ -118,10 +117,10 @@ cdef cypclass ActivityCounterSync(ActhonSyncInterface): ...@@ -118,10 +117,10 @@ cdef cypclass ActivityCounterSync(ActhonSyncInterface):
void removeActivity(self): void removeActivity(self):
self.count -= 1 self.count -= 1
bint isCompleted(const self): bint isCompleted(self):
return self.count == 0 return self.count == 0
bint isActivable(const self): bint isActivable(self):
cdef bint res = True cdef bint res = True
if self.previous_sync is not NULL: if self.previous_sync is not NULL:
prev_sync = self.previous_sync prev_sync = self.previous_sync
...@@ -135,7 +134,7 @@ cdef cypclass A activable: ...@@ -135,7 +134,7 @@ cdef cypclass A activable:
self.a = 0 self.a = 0
self._active_result_class = WaitResult.construct self._active_result_class = WaitResult.construct
self._active_queue_class = consume BasicQueue() self._active_queue_class = consume BasicQueue()
int getter(const self): int getter(self):
return self.a return self.a
void setter(self, int a): void setter(self, int a):
self.a = a self.a = a
......
...@@ -21,14 +21,3 @@ def test_is_cypclass(): ...@@ -21,14 +21,3 @@ def test_is_cypclass():
r = <RightBase> d r = <RightBase> d
return d is d, l is d, r is d, l is r return d is d, l is d, r is d, l is r
def test_is_cypclass_const():
"""
>>> test_is_cypclass_const()
(True, True, True, True)
"""
cdef const Derived d = Derived()
cdef const LeftBase l = <LeftBase> d
cdef const RightBase r = <RightBase> d
return d is d, l is d, r is d, l is r
...@@ -26,22 +26,3 @@ def test_insinstanceof(): ...@@ -26,22 +26,3 @@ def test_insinstanceof():
cdef int r6 = isinstanceof[Derived](derived) cdef int r6 = isinstanceof[Derived](derived)
print(r1, r2, r3, r4, r5, r6) print(r1, r2, r3, r4, r5, r6)
def test_const_insinstanceof():
"""
>>> test_const_insinstanceof()
(1, 1, 1, 0, 1, 1)
"""
cdef const Base base = Base()
cdef const Base derived_as_base = Derived()
cdef const Derived derived = Derived()
cdef int r1 = isinstanceof[Base](base)
cdef int r2 = isinstanceof[Base](derived_as_base)
cdef int r3 = isinstanceof[Base](derived)
cdef int r4 = isinstanceof[Derived](base)
cdef int r5 = isinstanceof[Derived](derived_as_base)
cdef int r6 = isinstanceof[Derived](derived)
print(r1, r2, r3, r4, r5, r6)
...@@ -105,7 +105,7 @@ cdef cypclass Subscript: ...@@ -105,7 +105,7 @@ cdef cypclass Subscript:
self.value = NULL self.value = NULL
self.index = NULL self.index = NULL
Value __getitem__(const self, Index index): Value __getitem__(self, Index index):
if self.index is index: if self.index is index:
return value return value
return NULL return NULL
......
...@@ -175,7 +175,7 @@ cdef cypclass Subscript: ...@@ -175,7 +175,7 @@ cdef cypclass Subscript:
self.value = NULL self.value = NULL
self.index = NULL self.index = NULL
Value __getitem__(const self, Index index): Value __getitem__(self, Index index):
if self.index is index: if self.index is index:
return value return value
return NULL return NULL
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment