11// ================================================================
2- // ORDERED MAP FROM STRING TO INTERFACE{}
2+ // ORDERED MAP FROM STRING TO GENERIC VALUE TYPE
33//
4- // Quite like types.OrderedMap but only with interface{} keys. See orderedMap.go for
4+ // Quite like types.OrderedMap but only with string keys. See orderedMap.go for
55// more information.
66// ================================================================
77
88package lib
99
1010// ----------------------------------------------------------------
11- type OrderedMap struct {
11+ type OrderedMap [ V any ] struct {
1212 FieldCount int64
13- Head * orderedMapEntry
14- Tail * orderedMapEntry
15- keysToEntries map [string ]* orderedMapEntry
13+ Head * orderedMapEntry [ V ]
14+ Tail * orderedMapEntry [ V ]
15+ keysToEntries map [string ]* orderedMapEntry [ V ]
1616}
1717
18- type orderedMapEntry struct {
18+ type orderedMapEntry [ V any ] struct {
1919 Key string
20- Value interface {}
21- Prev * orderedMapEntry
22- Next * orderedMapEntry
20+ Value V
21+ Prev * orderedMapEntry [ V ]
22+ Next * orderedMapEntry [ V ]
2323}
2424
2525// ----------------------------------------------------------------
26- func NewOrderedMap () * OrderedMap {
27- return & OrderedMap {
26+ func NewOrderedMap [ V any ] () * OrderedMap [ V ] {
27+ return & OrderedMap [ V ] {
2828 FieldCount : 0 ,
2929 Head : nil ,
3030 Tail : nil ,
31- keysToEntries : make (map [string ]* orderedMapEntry ),
31+ keysToEntries : make (map [string ]* orderedMapEntry [ V ] ),
3232 }
3333}
3434
3535// ----------------------------------------------------------------
3636// Value-copy is up to the caller -- PutReference and PutCopy
3737// are in the public OrderedMap API.
38- func newOrderedMapEntry (key * string , value interface {} ) * orderedMapEntry {
39- return & orderedMapEntry {
38+ func newOrderedMapEntry [ V any ] (key * string , value V ) * orderedMapEntry [ V ] {
39+ return & orderedMapEntry [ V ] {
4040 * key ,
4141 value ,
4242 nil ,
@@ -45,15 +45,15 @@ func newOrderedMapEntry(key *string, value interface{}) *orderedMapEntry {
4545}
4646
4747// ----------------------------------------------------------------
48- func (omap * OrderedMap ) IsEmpty () bool {
48+ func (omap * OrderedMap [ V ] ) IsEmpty () bool {
4949 return omap .FieldCount == 0
5050}
5151
52- func (omap * OrderedMap ) Has (key string ) bool {
52+ func (omap * OrderedMap [ V ] ) Has (key string ) bool {
5353 return omap .findEntry (& key ) != nil
5454}
5555
56- func (omap * OrderedMap ) findEntry (key * string ) * orderedMapEntry {
56+ func (omap * OrderedMap [ V ] ) findEntry (key * string ) * orderedMapEntry [ V ] {
5757 if omap .keysToEntries != nil {
5858 return omap .keysToEntries [* key ]
5959 } else {
@@ -67,7 +67,7 @@ func (omap *OrderedMap) findEntry(key *string) *orderedMapEntry {
6767}
6868
6969// ----------------------------------------------------------------
70- func (omap * OrderedMap ) Put (key string , value interface {} ) {
70+ func (omap * OrderedMap [ V ] ) Put (key string , value V ) {
7171 pe := omap .findEntry (& key )
7272 if pe == nil {
7373 pe = newOrderedMapEntry (& key , value )
@@ -90,30 +90,30 @@ func (omap *OrderedMap) Put(key string, value interface{}) {
9090}
9191
9292// ----------------------------------------------------------------
93- func (omap * OrderedMap ) Get (key string ) interface {} {
93+ func (omap * OrderedMap [ V ] ) Get (key string ) V {
9494 pe := omap .findEntry (& key )
9595 if pe == nil {
96- return nil
97- } else {
98- return pe .Value
96+ var zero V
97+ return zero
9998 }
99+ return pe .Value
100100}
101101
102102// The Get is sufficient for pointer values -- the caller can check if the
103103// return value is nil. For int/string values (which are non-nullable) we have
104104// this method.
105- func (omap * OrderedMap ) GetWithCheck (key string ) (interface {} , bool ) {
105+ func (omap * OrderedMap [ V ] ) GetWithCheck (key string ) (V , bool ) {
106106 pe := omap .findEntry (& key )
107107 if pe == nil {
108- return nil , false
109- } else {
110- return pe .Value , true
108+ var zero V
109+ return zero , false
111110 }
111+ return pe .Value , true
112112}
113113
114114// ----------------------------------------------------------------
115115// Returns true if it was found and removed
116- func (omap * OrderedMap ) Remove (key string ) bool {
116+ func (omap * OrderedMap [ V ] ) Remove (key string ) bool {
117117 pe := omap .findEntry (& key )
118118 if pe == nil {
119119 return false
@@ -124,7 +124,7 @@ func (omap *OrderedMap) Remove(key string) bool {
124124}
125125
126126// ----------------------------------------------------------------
127- func (omap * OrderedMap ) unlink (pe * orderedMapEntry ) {
127+ func (omap * OrderedMap [ V ] ) unlink (pe * orderedMapEntry [ V ] ) {
128128 if pe == omap .Head {
129129 if pe == omap .Tail {
130130 omap .Head = nil
0 commit comments