3 // namespace: System.Text.RegularExpressions
6 // author: Dan Lewis (dlewis@gmx.co.uk)
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System
.Collections
;
33 namespace System
.Text
.RegularExpressions
{
36 public FactoryCache (int capacity
) {
37 this.capacity
= capacity
;
38 this.factories
= new Hashtable (capacity
);
39 this.mru_list
= new MRUList ();
42 public void Add (string pattern
, RegexOptions options
, IMachineFactory factory
) {
44 Key k
= new Key (pattern
, options
);
46 while (factories
.Count
>= capacity
) {
47 object victim
= mru_list
.Evict ();
49 factories
.Remove ((Key
)victim
);
52 factories
[k
] = factory
;
57 public IMachineFactory
Lookup (string pattern
, RegexOptions options
) {
59 Key k
= new Key (pattern
, options
);
60 if (factories
.Contains (k
)) {
62 return (IMachineFactory
)factories
[k
];
70 private Hashtable factories
;
71 private MRUList mru_list
;
74 public string pattern
;
75 public RegexOptions options
;
77 public Key (string pattern
, RegexOptions options
) {
78 this.pattern
= pattern
;
79 this.options
= options
;
82 public override int GetHashCode () {
83 return pattern
.GetHashCode () ^
(int)options
;
86 public override bool Equals (object o
) {
87 if (o
== null || !(o
is Key
))
91 return options
== k
.options
&& pattern
.Equals (k
.pattern
);
94 public override string ToString () {
95 return "('" + pattern
+ "', [" + options
+ "])";
105 public void Use (object o
) {
115 while (node
!= null && !o
.Equals (node
.value))
116 node
= node
.previous
;
127 node
.previous
.next
= node
.next
;
129 node
.next
.previous
= node
.previous
;
133 node
.previous
= head
;
138 public object Evict () {
142 object o
= tail
.value;
148 tail
.previous
= null;
153 private Node head
, tail
;
157 public Node previous
, next
;
159 public Node (object value) {