root/as3/SiOPM/trunk/src/org/si/utils/SLLint.as

リビジョン 4264, 5.1 kB (コミッタ: keim, コミット時期: 2 年 前)

SiON ver0.61 updated

Line 
1 //----------------------------------------------------------------------------------------------------
2 // Singly linked list of int
3 //  Copyright (c) 2008 keim All rights reserved.
4 //  Distributed under BSD-style license (see org.si.license.txt).
5 //----------------------------------------------------------------------------------------------------
6
7
8
9
10 package org.si.utils {
11     /** Singly linked list of int. */
12     public class SLLint
13     {
14     // valiables
15     //------------------------------------------------------------
16         /** int data */
17         public var i:int = 0;
18         /** Next pointer of list */
19         public var next:SLLint = null;
20
21         // free list
22         static private var _freeList:SLLint = null;
23
24        
25        
26        
27     // constructor
28     //------------------------------------------------------------
29         /** Constructor */
30         function SLLint(i:int=0)
31         {
32             this.i = i;
33         }
34        
35        
36        
37        
38     // allocator
39     //------------------------------------------------------------
40         /** Allocator */
41         static public function alloc(i:int=0) : SLLint
42         {
43             var ret:SLLint;
44             if (_freeList) {
45                 ret = _freeList;
46                 _freeList = _freeList.next;
47                 ret.i = i;
48                 ret.next = null;
49             } else {
50                 ret = new SLLint(i);
51             }
52             return ret;
53         }
54        
55         /** Allocator of linked list */
56         static public function allocList(size:int, defaultData:int=0) : SLLint
57         {
58             var ret:SLLint = alloc(defaultData),
59                 elem:SLLint = ret;
60             for (var i:int=1; i<size; i++) {
61                 elem.next = alloc(defaultData);
62                 elem = elem.next;
63             }
64             return ret;
65         }
66        
67         /** Allocator of ring-linked list */
68         static public function allocRing(size:int, defaultData:int=0) : SLLint
69         {
70             var ret:SLLint = alloc(defaultData),
71                 elem:SLLint = ret;
72             for (var i:int=1; i<size; i++) {
73                 elem.next = alloc(defaultData);
74                 elem = elem.next;
75             }
76             elem.next = ret;
77             return ret;
78         }
79        
80         /** Ring-linked list with initial values. */
81         static public function newRing(...args) : SLLint
82         {
83             var size:int = args.length,
84                 ret:SLLint = alloc(args[0]),
85                 elem:SLLint = ret;
86             for (var i:int=1; i<size; i++) {
87                 elem.next = alloc(args[i]);
88                 elem = elem.next;
89             }
90             elem.next = ret;
91             return ret;
92         }
93        
94        
95        
96        
97     // deallocator
98     //------------------------------------------------------------
99         /** Deallocator */
100         static public function free(elem:SLLint) : void
101         {
102             elem.next = _freeList;
103             _freeList = elem;
104         }
105        
106         /** Deallocator of linked list */
107         static public function freeList(firstElem:SLLint) : void
108         {
109             if (firstElem == null) return;
110             var lastElem:SLLint = firstElem;
111             while (lastElem.next) { lastElem = lastElem.next; }
112             lastElem.next = _freeList;
113             _freeList = firstElem;
114         }
115        
116         /** Deallocator of ring-linked list */
117         static public function freeRing(firstElem:SLLint) : void
118         {
119             if (firstElem == null) return;
120             var lastElem:SLLint = firstElem;
121             while (lastElem.next == firstElem) { lastElem = lastElem.next; }
122             lastElem.next = _freeList;
123             _freeList = firstElem;
124         }
125        
126        
127        
128        
129     // carete pager
130     //------------------------------------------------------------
131         /** Create pager of linked list */
132         static public function createListPager(firstElem:SLLint, fixedSize:Boolean) : Vector.<SLLint>
133         {
134             if (firstElem == null) return null;
135             var elem:SLLint, i:int, size:int;
136             for (size = 1, elem = firstElem; elem.next != null; elem = elem.next) { size++; }
137             var pager:Vector.<SLLint> = new Vector.<SLLint>(size, fixedSize);
138             elem = firstElem;
139             for (i=0; i<size; i++) { pager[i] = elem; elem = elem.next; }
140             return pager;
141         }
142
143         /** Create pager of ring-linked list */
144         static public function createRingPager(firstElem:SLLint, fixedSize:Boolean) : Vector.<SLLint>
145         {
146             if (firstElem == null) return null;
147             var elem:SLLint, i:int, size:int;
148             for (size = 1, elem = firstElem; elem.next != firstElem; elem = elem.next) { size++; }
149             var pager:Vector.<SLLint> = new Vector.<SLLint>(size, fixedSize);
150             elem = firstElem;
151             for (i=0; i<size; i++) { pager[i] = elem; elem = elem.next; }
152             return pager;
153         }
154     }
155 }
156
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。