1 package org.lcsim.geometry.util;
2
3
4
5
6
7 public class IDEncoder
8 {
9 private IDDescriptor desc;
10 private long id;
11
12 public IDEncoder(IDDescriptor desc)
13 {
14 this.desc = desc;
15 }
16 public long setValue(String name, int value)
17 {
18 return setValue(desc.indexOf(name),value);
19 }
20 public long setValue(int index, int value)
21 {
22 int start = desc.fieldStart(index);
23 int length = desc.fieldLength(index);
24 long mask = ((1L<<length) - 1) << start;
25 id &= ~mask;
26 id |= (((long) value)<<start) & mask;
27
28 return id;
29 }
30 public long setValues(int[] values)
31 {
32 if (values.length != desc.fieldCount()) throw new IllegalArgumentException("Invalid array length");
33 long result = 0;
34 for (int i=0; i<values.length; i++)
35 {
36 int start = desc.fieldStart(i);
37 int length = desc.fieldLength(i);
38 long mask = ((1L<<length) - 1);
39 result |= (mask & values[i]) << start;
40 }
41 return id = result;
42 }
43 public long getID()
44 {
45 return id;
46 }
47 }