コード例 #1
0
ファイル: persistent_hash_map.py プロジェクト: stuarth/pixie
    def find(self, shift, hash_val, key, not_found):
        for x in range(0, len(self._array), 2):
            key_or_nil = self._array[x]
            if key_or_nil is not None and rt.eq(key_or_nil, key):
                return self._array[x + 1]

        return not_found
コード例 #2
0
ファイル: persistent_hash_map.py プロジェクト: squaremo/pixie
    def find(self, shift, hash_val, key, not_found):
        for x in range(0, len(self._array), 2):
            key_or_nil = self._array[x]
            if key_or_nil is not None and rt.eq(key_or_nil, key):
                return self._array[x + 1]

        return not_found
コード例 #3
0
ファイル: persistent_hash_map.py プロジェクト: Hardikus/pixie
    def without_inode(self, shift, hash, key):
        bit = bitpos(hash, shift)
        if self._bitmap & bit == 0:
            return self

        idx = self.index(bit)
        key_or_none = self._array[2 * idx]
        val_or_node = self._array[2 * idx + 1]

        if key_or_none is None:
            n = val_or_node.without_inode(shift + 5, hash, key)
            if n is val_or_node:
                return self
            if n is not None:
                return BitmapIndexedNode(None, self._bitmap, clone_and_set(self._array, 2 * idx + 1, n))

            if self._bitmap == bit:
                return None

            return BitmapIndexedNode(None, self._bitmap ^ bit, remove_pair(self._array, idx))

        if rt.eq(key, key_or_none):
            return BitmapIndexedNode(None, self._bitmap ^ bit, remove_pair(self._array, idx))

        return self
コード例 #4
0
ファイル: persistent_hash_map.py プロジェクト: stuarth/pixie
    def without_inode(self, shift, hash, key):
        bit = bitpos(hash, shift)
        if self._bitmap & bit == 0:
            return self

        idx = self.index(bit)
        key_or_none = self._array[2 * idx]
        val_or_node = self._array[2 * idx + 1]

        if key_or_none is None:
            n = val_or_node.without_inode(shift + 5, hash, key)
            if n is val_or_node:
                return self
            if n is not None:
                return BitmapIndexedNode(
                    None, self._bitmap,
                    clone_and_set(self._array, 2 * idx + 1, n))

            if self._bitmap == bit:
                return None

            return BitmapIndexedNode(None, self._bitmap ^ bit,
                                     remove_pair(self._array, idx))

        if rt.eq(key, key_or_none):
            return BitmapIndexedNode(None, self._bitmap ^ bit,
                                     remove_pair(self._array, idx))

        return self
コード例 #5
0
ファイル: persistent_hash_map.py プロジェクト: Hardikus/pixie
    def find_index(self, key):
        i = r_int(0)
        while i < len(self._array):
            if rt.eq(key, self._array[i]):
                return i

            i += 2

        return r_int(-1)
コード例 #6
0
    def find_index(self, key):
        i = 0
        while i < len(self._array):
            if rt.eq(key, self._array[i]):
                return i

            i += 2

        return -1
コード例 #7
0
ファイル: persistent_hash_map.py プロジェクト: stuarth/pixie
    def find_index(self, key):
        i = r_int(0)
        while i < len(self._array):
            if rt.eq(key, self._array[i]):
                return i

            i += 2

        return r_int(-1)
コード例 #8
0
def _eq(self, obj):
    if self is obj:
        return true
    elif isinstance(obj, PersistentVector):
        if self._cnt != obj._cnt:
            return false
        for i in range(0, intmask(self._cnt)):
            if not rt.eq(self.nth(i), obj.nth(i)):
                return false
        return true
    else:
        if not rt.satisfies_QMARK_(proto.ISeqable, obj):
            return false
        seq = rt.seq(obj)
        for i in range(0, intmask(self._cnt)):
            if seq is nil or not rt.eq(self.nth(i), rt.first(seq)):
                return false
            seq = rt.next(seq)
        if seq is not nil:
            return false
        return true
コード例 #9
0
ファイル: persistent_hash_map.py プロジェクト: squaremo/pixie
 def find(self, shift, hash_val, key, not_found):
     bit = bitpos(hash_val, shift)
     if (self._bitmap & bit) == 0:
         return not_found
     idx = self.index(bit)
     key_or_null = self._array[2 * idx]
     val_or_node = self._array[2 * idx + 1]
     if key_or_null is None:
         return val_or_node.find(shift + 5, hash_val, key, not_found)
     if rt.eq(key, key_or_null):
         return val_or_node
     return not_found
コード例 #10
0
ファイル: persistent_hash_map.py プロジェクト: stuarth/pixie
 def find(self, shift, hash_val, key, not_found):
     bit = bitpos(hash_val, shift)
     if (self._bitmap & bit) == 0:
         return not_found
     idx = self.index(bit)
     key_or_null = self._array[2 * idx]
     val_or_node = self._array[2 * idx + 1]
     if key_or_null is None:
         return val_or_node.find(shift + 5, hash_val, key, not_found)
     if rt.eq(key, key_or_null):
         return val_or_node
     return not_found
コード例 #11
0
ファイル: persistent_hash_map.py プロジェクト: squaremo/pixie
    def assoc_inode(self, shift, hash_val, key, val, added_leaf):
        bit = bitpos(hash_val, shift)
        idx = self.index(bit)

        if (self._bitmap & bit) != 0:
            key_or_null = self._array[2 * idx]
            val_or_node = self._array[2 * idx + 1]

            if key_or_null is None:
                assert isinstance(val_or_node, INode)
                n = val_or_node.assoc_inode(shift + 5, hash_val, key, val, added_leaf)
                if n is val_or_node:
                    return self
                return BitmapIndexedNode(None, self._bitmap, clone_and_set(self._array, 2 * idx + 1, n))


            if key_or_null is None or rt.eq(key, key_or_null):
                if val is val_or_node:
                    return self
                return BitmapIndexedNode(None, self._bitmap, clone_and_set(self._array, 2 * idx + 1, val))

            added_leaf._val = added_leaf
            return BitmapIndexedNode(None, self._bitmap,
                clone_and_set2(self._array,
                               2 * idx, None,
                               2 * idx + 1, create_node(shift+ 5, key_or_null, val_or_node, hash_val, key, val)))
        else:
            n = bit_count(self._bitmap)
            if n >= 16:
                nodes = [None] * 32
                jdx = mask(hash_val, shift)
                nodes[jdx] = BitmapIndexedNode_EMPTY.assoc_inode(shift + 5, hash_val, key, val, added_leaf)
                j = 0

                for i in range(32):
                    if (self._bitmap >> i) & 1 != 0:
                        if self._array[j] is None:
                            nodes[i] = self._array[j + 1]
                        else:
                            nodes[i] = BitmapIndexedNode_EMPTY.assoc_inode(shift + 5, rt.hash(self._array[j]),
                                                               self._array[j], self._array[j + 1], added_leaf)
                        j += 1

                return ArrayNode(None, n + 1, nodes)
            else:
                new_array = [None] * (2 * (n + 1))
                list_copy(self._array, 0, new_array, 0, 2 * idx)
                new_array[2 * idx] = key
                added_leaf._val = added_leaf
                new_array[2 * idx + 1] = val
                list_copy(self._array, 2 * idx, new_array, 2 * (idx + 1), 2 * (n - idx))
                return BitmapIndexedNode(None, self._bitmap | bit, new_array)
コード例 #12
0
def _eq(self, obj):
    assert isinstance(self, PersistentVector)
    if self is obj:
        return true
    elif isinstance(obj, PersistentVector):
        if self._cnt != obj._cnt:
            return false
        for i in range(0, intmask(self._cnt)):
            if not rt.eq(self.nth(i), obj.nth(i)):
                return false
        return true
    else:
        if obj is nil or not rt.satisfies_QMARK_(proto.ISeqable, obj):
            return false
        seq = rt.seq(obj)
        for i in range(0, intmask(self._cnt)):
            if seq is nil or not rt.eq(self.nth(i), rt.first(seq)):
                return false
            seq = rt.next(seq)
        if seq is not nil:
            return false
        return true
コード例 #13
0
ファイル: reader.py プロジェクト: rowhit/pixie
    def invoke(self, rdr, ch):
        if ARG_ENV.deref() is nil:
            return read_symbol(rdr, ch)

        ch = rdr.read()
        rdr.unread()
        if is_whitespace(ch) or is_terminating_macro(ch):
            return ArgReader.register_next_arg(1)

        n = read_inner(rdr, True)
        if rt.eq(n, ARG_AMP):
            return ArgReader.register_next_arg(-1)
        if not isinstance(n, numbers.Integer):
            throw_syntax_error_with_data(rdr, u"%-arg must be %, %<integer> or %&")
        return ArgReader.register_next_arg(n.int_val())
コード例 #14
0
ファイル: reader.py プロジェクト: foodhype/pixie
def is_unquote_splicing(form):
    return True if rt.satisfies_QMARK_(rt.ISeq.deref(), form) \
                   and rt.eq(rt.first(form), UNQUOTE_SPLICING) \
           else False
コード例 #15
0
ファイル: reader.py プロジェクト: foodhype/pixie
def is_unquote(form):
    return True if rt.satisfies_QMARK_(rt.ISeq.deref(), form) \
                   and rt.eq(rt.first(form), UNQUOTE) \
           else False
コード例 #16
0
ファイル: reader.py プロジェクト: rowhit/pixie
def is_unquote_splicing(form):
    return True if rt._satisfies_QMARK_(rt.ISeq.deref(), form) \
                   and rt.eq(rt.first(form), UNQUOTE_SPLICING) \
           else False
コード例 #17
0
ファイル: reader.py プロジェクト: rowhit/pixie
def is_unquote(form):
    return True if rt._satisfies_QMARK_(rt.ISeq.deref(), form) \
                   and rt.eq(rt.first(form), UNQUOTE) \
           else False
コード例 #18
0
ファイル: target.py プロジェクト: gigasquid/pixie
 def set_recent_vars(self, val):
     if rt.eq(val, STAR_1.deref()):
         return
     STAR_3.set_root(STAR_2.deref())
     STAR_2.set_root(STAR_1.deref())
     STAR_1.set_root(val)
コード例 #19
0
 def set_recent_vars(self, val):
     if rt.eq(val, STAR_1.deref()):
         return
     STAR_3.set_root(STAR_2.deref())
     STAR_2.set_root(STAR_1.deref())
     STAR_1.set_root(val)
コード例 #20
0
ファイル: persistent_hash_map.py プロジェクト: stuarth/pixie
    def assoc_inode(self, shift, hash_val, key, val, added_leaf):
        bit = bitpos(hash_val, shift)
        idx = self.index(bit)

        if (self._bitmap & bit) != 0:
            key_or_null = self._array[2 * idx]
            val_or_node = self._array[2 * idx + 1]

            if key_or_null is None:
                assert isinstance(val_or_node, INode)
                n = val_or_node.assoc_inode(shift + 5, hash_val & MASK_32, key,
                                            val, added_leaf)
                if n is val_or_node:
                    return self
                return BitmapIndexedNode(
                    None, self._bitmap,
                    clone_and_set(self._array, 2 * idx + 1, n))

            if rt.eq(key, key_or_null):
                if val is val_or_node:
                    return self
                return BitmapIndexedNode(
                    None, self._bitmap,
                    clone_and_set(self._array, 2 * idx + 1, val))

            added_leaf._val = added_leaf
            return BitmapIndexedNode(
                None, self._bitmap,
                clone_and_set2(
                    self._array, 2 * idx, None, 2 * idx + 1,
                    create_node(shift + 5, key_or_null, val_or_node, hash_val,
                                key, val)))
        else:
            n = bit_count(self._bitmap)
            if n >= 16:
                nodes = [None] * 32
                jdx = mask(hash_val, shift)
                nodes[jdx] = BitmapIndexedNode_EMPTY.assoc_inode(
                    shift + 5, hash_val, key, val, added_leaf)
                j = 0

                for i in range(32):
                    if (self._bitmap >> i) & 1 != 0:
                        if self._array[j] is None:
                            nodes[i] = self._array[j + 1]
                        else:
                            nodes[i] = BitmapIndexedNode_EMPTY.assoc_inode(
                                shift + 5, rt.hash(self._array[j]),
                                self._array[j], self._array[j + 1], added_leaf)
                        j += 2

                return ArrayNode(None, n + 1, nodes)
            else:
                new_array = [None] * (2 * (n + 1))
                list_copy(self._array, 0, new_array, 0, 2 * idx)
                new_array[2 * idx] = key
                added_leaf._val = added_leaf
                new_array[2 * idx + 1] = val
                list_copy(self._array, 2 * idx, new_array, 2 * (idx + 1),
                          2 * (n - idx))
                return BitmapIndexedNode(None, self._bitmap | bit, new_array)