Skip to content

Commit a23a7fb

Browse files
committed
array storage 추가
1 parent c7faea7 commit a23a7fb

File tree

7 files changed

+249
-143
lines changed

7 files changed

+249
-143
lines changed

aheui/_compat.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,8 @@ def _bytestr(i):
100100
from aheui.int import bigint # Enable bigint in rpython build
101101
else:
102102
from aheui.int import smallint as bigint # noqa: F401 smallint or python support
103+
104+
try:
105+
from aheui.storage.linkedlist import Stack, Queue, Port
106+
except ImportError:
107+
from aheui.storage.array import Stack, Queue, Port # noqa: F401 smallint or python support

aheui/aheui.py

Lines changed: 1 addition & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from aheui import const as c
99
from aheui._argparse import InformationException, get_prog
10-
from aheui._compat import jit, unichr, ord, _unicode, bigint, PYR
10+
from aheui._compat import jit, unichr, ord, _unicode, bigint, PYR, Stack, Queue, Port
1111
from aheui import compile
1212
from aheui.option import process_options, OptionError
1313
from aheui.warning import NoRpythonWarning, WriteUtf8RangeWarning, warnings
@@ -32,144 +32,6 @@ def get_location(pc, stackok, is_queue, program):
3232

3333

3434
DEBUG = False # debug flag for `rpaheui`
35-
MINUS1 = bigint.fromlong(-1)
36-
37-
38-
class Node(object):
39-
"""Element unit for stack and queue."""
40-
41-
def __init__(self, next, value=MINUS1):
42-
self.value = value
43-
self.next = next
44-
45-
46-
class LinkedList(object):
47-
"""Common linked list for storages"""
48-
49-
def __len__(self):
50-
return self.size
51-
52-
def pop(self):
53-
node = self.head
54-
self.head = node.next
55-
value = node.value
56-
del node
57-
self.size -= 1
58-
return value
59-
60-
def swap(self):
61-
node1 = self.head
62-
node2 = node1.next
63-
node1.value, node2.value = node2.value, node1.value
64-
65-
def add(self):
66-
r1, r2 = self._get_2_values()
67-
r = bigint.add(r2, r1)
68-
self._put_value(r)
69-
70-
def sub(self):
71-
r1, r2 = self._get_2_values()
72-
r = bigint.sub(r2, r1)
73-
self._put_value(r)
74-
75-
def mul(self):
76-
r1, r2 = self._get_2_values()
77-
r = bigint.mul(r2, r1)
78-
self._put_value(r)
79-
80-
def div(self):
81-
r1, r2 = self._get_2_values()
82-
r = bigint.div(r2, r1)
83-
self._put_value(r)
84-
85-
def mod(self):
86-
r1, r2 = self._get_2_values()
87-
r = bigint.mod(r2, r1)
88-
self._put_value(r)
89-
90-
def cmp(self):
91-
r1, r2 = self._get_2_values()
92-
r = int(bigint.ge(r2, r1))
93-
big_r = bigint.fromint(r)
94-
self._put_value(big_r)
95-
96-
97-
class Stack(LinkedList):
98-
"""Base data storage for Aheui, except for ieung and hieuh."""
99-
100-
def __init__(self):
101-
self.head = None
102-
self.size = 0
103-
104-
def push(self, value):
105-
# assert(isinstance(value, bigint.Int))
106-
node = Node(self.head, value)
107-
self.head = node
108-
self.size += 1
109-
110-
def dup(self):
111-
self.push(self.head.value)
112-
113-
# Tools for common methods. inline?
114-
115-
def _get_2_values(self):
116-
return self.pop(), self.head.value
117-
118-
def _put_value(self, value):
119-
self.head.value = value
120-
121-
122-
class Queue(LinkedList):
123-
124-
def __init__(self):
125-
self.tail = Node(None)
126-
self.head = self.tail
127-
self.size = 0
128-
129-
def push(self, value):
130-
# assert(isinstance(value, bigint.Int))
131-
tail = self.tail
132-
tail.value = value
133-
new = Node(None)
134-
tail.next = new
135-
self.tail = new
136-
self.size += 1
137-
138-
def dup(self):
139-
head = self.head
140-
node = Node(head, head.value)
141-
self.head = node
142-
self.size += 1
143-
144-
def _get_2_values(self):
145-
return self.pop(), self.pop()
146-
147-
def _put_value(self, value):
148-
self.push(value)
149-
150-
151-
class Port(LinkedList):
152-
153-
def __init__(self):
154-
self.head = None
155-
self.size = 0
156-
self.last_push = bigint.fromint(0)
157-
158-
def push(self, value):
159-
# assert(isinstance(value, bigint.Int))
160-
node = Node(self.head, value)
161-
self.head = node
162-
self.size += 1
163-
self.last_push = value
164-
165-
def dup(self):
166-
self.push(self.last_push)
167-
168-
def _get_2_values(self):
169-
return self.pop(), self.head.value
170-
171-
def _put_value(self, value):
172-
self.head.value = value
17335

17436

17537
class Storage(object):

aheui/int/bigint.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
from aheui._compat import jit
2+
from rpython.rlib import jit
33
from rpython.rlib.rbigint import rbigint
44

55

@@ -72,3 +72,6 @@ def is_zero(r):
7272
@jit.elidable
7373
def is_unicodepoint(r):
7474
return 0 <= r._size and r.int_le(0x110000)
75+
76+
77+
MINUS1 = fromlong(-1)

aheui/int/smallint.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,20 @@
44
import builtins
55
except ImportError:
66
builtins = __builtins__
7-
from aheui._compat import _bytestr
7+
from aheui._compat import _bytestr, PY3
88

99

1010
NAME = 'smallint'
1111

1212

13-
Int = int
13+
if PY3:
14+
Int = int
15+
else:
16+
Int = long
1417

1518

1619
def fromstr(s):
17-
return int(s)
20+
return Int(s)
1821

1922

2023
def fromint(v):
@@ -71,3 +74,6 @@ def is_zero(r):
7174

7275
def is_unicodepoint(r):
7376
return 0 < r <= 0x110000
77+
78+
79+
MINUS1 = Int(-1)

aheui/storage/__init__.py

Whitespace-only changes.

aheui/storage/array.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
from collections import deque
2+
from aheui._compat import PYR
3+
4+
5+
assert not PYR, 'RPython must use linkedlist'
6+
7+
8+
class Stack(list):
9+
__slots__ = ()
10+
11+
def push(self, value):
12+
self.append(value)
13+
14+
def dup(self):
15+
self.append(self[-1])
16+
17+
def swap(self):
18+
self[-1], self[-2] = self[-2], self[-1]
19+
20+
def add(self):
21+
top = self.pop()
22+
self[-1] += top
23+
24+
def sub(self):
25+
top = self.pop()
26+
self[-1] -= top
27+
28+
def mul(self):
29+
top = self.pop()
30+
self[-1] *= top
31+
32+
def div(self):
33+
top = self.pop()
34+
self[-1] /= top
35+
36+
def mod(self):
37+
top = self.pop()
38+
self[-1] %= top
39+
40+
def cmp(self):
41+
top = self.pop()
42+
self[-1] = self[-1] >= top
43+
44+
45+
class Queue(deque):
46+
__slots__ = ()
47+
48+
def push(self, value):
49+
self.appendleft(value)
50+
51+
def dup(self):
52+
self.appendleft(self[0])
53+
54+
def swap(self):
55+
self[-1], self[-2] = self[-2], self[-1]
56+
57+
def add(self):
58+
top = self.pop()
59+
self.appendleft(self.pop() + top)
60+
61+
def sub(self):
62+
top = self.pop()
63+
self.appendleft(self.pop() - top)
64+
65+
def mul(self):
66+
top = self.pop()
67+
self.appendleft(self.pop() * top)
68+
69+
def div(self):
70+
top = self.pop()
71+
self.appendleft(self.pop() / top)
72+
73+
def mod(self):
74+
top = self.pop()
75+
self.appendleft(self.pop() % top)
76+
77+
def cmp(self):
78+
top = self.pop()
79+
self.appendleft(self.pop() >= top)
80+
81+
82+
Port = Stack

0 commit comments

Comments
 (0)