aboutsummaryrefslogtreecommitdiffstats
path: root/Godeps/_workspace/src/github.com/ethereum/serpent-go/serpent/examples/counterparty/heap.se
diff options
context:
space:
mode:
Diffstat (limited to 'Godeps/_workspace/src/github.com/ethereum/serpent-go/serpent/examples/counterparty/heap.se')
-rw-r--r--Godeps/_workspace/src/github.com/ethereum/serpent-go/serpent/examples/counterparty/heap.se69
1 files changed, 69 insertions, 0 deletions
diff --git a/Godeps/_workspace/src/github.com/ethereum/serpent-go/serpent/examples/counterparty/heap.se b/Godeps/_workspace/src/github.com/ethereum/serpent-go/serpent/examples/counterparty/heap.se
new file mode 100644
index 000000000..4a43a3974
--- /dev/null
+++ b/Godeps/_workspace/src/github.com/ethereum/serpent-go/serpent/examples/counterparty/heap.se
@@ -0,0 +1,69 @@
+data heaps[2^50](owner, size, nodes[2^50](key, value))
+data heapIndex
+
+def register():
+ i = self.heapIndex
+ self.heaps[i].owner = msg.sender
+ self.heapIndex = i + 1
+ return(i)
+
+def push(heap, key, value):
+ assert msg.sender == self.heaps[heap].owner
+ sz = self.heaps[heap].size
+ self.heaps[heap].nodes[sz].key = key
+ self.heaps[heap].nodes[sz].value = value
+ k = sz + 1
+ while k > 1:
+ bottom = self.heaps[heap].nodes[k].key
+ top = self.heaps[heap].nodes[k/2].key
+ if bottom < top:
+ tvalue = self.heaps[heap].nodes[k/2].value
+ bvalue = self.heaps[heap].nodes[k].value
+ self.heaps[heap].nodes[k].key = top
+ self.heaps[heap].nodes[k].value = tvalue
+ self.heaps[heap].nodes[k/2].key = bottom
+ self.heaps[heap].nodes[k/2].value = bvalue
+ k /= 2
+ else:
+ k = 0
+ self.heaps[heap].size = sz + 1
+
+def pop(heap):
+ sz = self.heaps[heap].size
+ assert sz
+ prevtop = self.heaps[heap].nodes[1].value
+ self.heaps[heap].nodes[1].key = self.heaps[heap].nodes[sz].key
+ self.heaps[heap].nodes[1].value = self.heaps[heap].nodes[sz].value
+ self.heaps[heap].nodes[sz].key = 0
+ self.heaps[heap].nodes[sz].value = 0
+ top = self.heaps[heap].nodes[1].key
+ k = 1
+ while k * 2 < sz:
+ bottom1 = self.heaps[heap].nodes[k * 2].key
+ bottom2 = self.heaps[heap].nodes[k * 2 + 1].key
+ if bottom1 < top and (bottom1 < bottom2 or k * 2 + 1 >= sz):
+ tvalue = self.heaps[heap].nodes[1].value
+ bvalue = self.heaps[heap].nodes[k * 2].value
+ self.heaps[heap].nodes[k].key = bottom1
+ self.heaps[heap].nodes[k].value = bvalue
+ self.heaps[heap].nodes[k * 2].key = top
+ self.heaps[heap].nodes[k * 2].value = tvalue
+ k = k * 2
+ elif bottom2 < top and bottom2 < bottom1 and k * 2 + 1 < sz:
+ tvalue = self.heaps[heap].nodes[1].value
+ bvalue = self.heaps[heap].nodes[k * 2 + 1].value
+ self.heaps[heap].nodes[k].key = bottom2
+ self.heaps[heap].nodes[k].value = bvalue
+ self.heaps[heap].nodes[k * 2 + 1].key = top
+ self.heaps[heap].nodes[k * 2 + 1].value = tvalue
+ k = k * 2 + 1
+ else:
+ k = sz
+ self.heaps[heap].size = sz - 1
+ return(prevtop)
+
+def top(heap):
+ return(self.heaps[heap].nodes[1].value)
+
+def size(heap):
+ return(self.heaps[heap].size)