# ===--- SwiftIntTypes.py ----------------------------*- coding: utf-8 -*-===// # # This source file is part of the Swift.org open source project # # Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors # Licensed under Apache License v2.0 with Runtime Library Exception # # See http://swift.org/LICENSE.txt for license information # See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors # Bit counts for all int types _all_integer_type_bitwidths = [8, 16, 32, 64] # Number of bits in the biggest int type int_max_bits = max(_all_integer_type_bitwidths) class SwiftIntegerType(object): def __init__(self, is_word, bits, is_signed): self.is_word = is_word self.bits = bits self.is_signed = is_signed if is_word: self.possible_bitwidths = [32, 64] else: self.possible_bitwidths = [bits] # Derived properties self.stdlib_name = \ ('' if is_signed else 'U') + \ 'Int' + \ ('' if is_word else str(bits)) self.builtin_name = 'Int' + str(bits) def get_opposite_signedness(self): return SwiftIntegerType(self.is_word, self.bits, not self.is_signed) def __eq__(self, other): return self.is_word == other.is_word and \ self.bits == other.bits and \ self.is_signed == other.is_signed def __ne__(self, other): return not self.__eq__(other) def all_integer_types(word_bits): for bitwidth in _all_integer_type_bitwidths: for is_signed in [False, True]: yield SwiftIntegerType( is_word=False, bits=bitwidth, is_signed=is_signed) for is_signed in [False, True]: yield SwiftIntegerType( is_word=True, bits=word_bits, is_signed=is_signed) # 'truncatingBitPattern' initializer is defined if the conversion is truncating # on any platform that Swift supports. def should_define_truncating_bit_pattern_init(src_ty, dst_ty): # Don't define a truncating conversion between a type and itself. if src_ty == dst_ty: return False # Conversion to opposite signedness is never truncating. if src_ty == dst_ty.get_opposite_signedness(): return False for src_ty_bits in src_ty.possible_bitwidths: for dst_ty_bits in dst_ty.possible_bitwidths: if src_ty_bits > dst_ty_bits: return True return False def all_integer_type_names(): return [self_ty.stdlib_name for self_ty in all_integer_types(0)] def all_real_number_type_names(): # FIXME , 'Float80' Revert until I figure out a test failure # Float80 # for i386 & x86_64 return ['Float', 'Double'] def all_numeric_type_names(): return all_integer_type_names() + all_real_number_type_names() def numeric_type_names_macintosh_only(): return ['Float80'] # Swift_Programming_Language/Expressions.html def all_integer_binary_operator_names(): return ['<<', '>>', '&*', '&', '&+', '&-', '|', '^'] def all_integer_or_real_binary_operator_names(): return ['*', '/', '%', '+', '-', '..<', '...'] def all_arithmetic_comparison_operator_names(): return ['<', '<=', '>', '>=', '==', '!='] def all_integer_assignment_operator_names(): return ['<<=', '>>=', '&=', '^=', '|='] def all_integer_or_real_assignment_operator_names(): return ['=', '*=', '/=', '%=', '+=', '-=']