MCPcopy Index your code
hub / github.com/clojure/clojure / PersistentStructMap

Class PersistentStructMap

src/jvm/clojure/lang/PersistentStructMap.java:20–259  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

18import java.util.NoSuchElementException;
19
20public class PersistentStructMap extends APersistentMap implements IObj{
21
22private static final long serialVersionUID = -2701411408470234065L;
23
24public static class Def implements Serializable{
25 final ISeq keys;
26 final IPersistentMap keyslots;
27
28 Def(ISeq keys, IPersistentMap keyslots){
29 this.keys = keys;
30 this.keyslots = keyslots;
31 }
32}
33
34final Def def;
35final Object[] vals;
36final IPersistentMap ext;
37final IPersistentMap _meta;
38
39
40static public Def createSlotMap(ISeq keys){
41 if(keys == null)
42 throw new IllegalArgumentException("Must supply keys");
43 int c = RT.count(keys);
44 Object[] v = new Object[2*c];
45 int i = 0;
46 for(ISeq s = keys; s != null; s = s.next(), i++)
47 {
48 v[2*i] = s.first();
49 v[2*i+1] = i;
50 }
51 return new Def(keys, RT.map(v));
52}
53
54static public PersistentStructMap create(Def def, ISeq keyvals){
55 Object[] vals = new Object[def.keyslots.count()];
56 IPersistentMap ext = PersistentHashMap.EMPTY;
57 for(; keyvals != null; keyvals = keyvals.next().next())
58 {
59 if(keyvals.next() == null)
60 throw new IllegalArgumentException(String.format("No value supplied for key: %s", keyvals.first()));
61 Object k = keyvals.first();
62 Object v = RT.second(keyvals);
63 Map.Entry e = def.keyslots.entryAt(k);
64 if(e != null)
65 vals[(Integer) e.getValue()] = v;
66 else
67 ext = ext.assoc(k, v);
68 }
69 return new PersistentStructMap(null, def, vals, ext);
70}
71
72static public PersistentStructMap construct(Def def, ISeq valseq){
73 Object[] vals = new Object[def.keyslots.count()];
74 IPersistentMap ext = PersistentHashMap.EMPTY;
75 for(int i = 0; i < vals.length && valseq != null; valseq = valseq.next(), i++)
76 {
77 vals[i] = valseq.first();

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected