• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 Google Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.caliper.model;
18 
19 import static com.google.common.base.Preconditions.checkArgument;
20 import static com.google.common.base.Preconditions.checkNotNull;
21 
22 import com.google.common.base.Function;
23 import com.google.common.base.MoreObjects;
24 import com.google.common.base.Objects;
25 import com.google.common.collect.ImmutableListMultimap;
26 import com.google.common.collect.Multimaps;
27 
28 import java.io.Serializable;
29 
30 /**
31  * A single, weighted measurement.
32  *
33  * @author gak@google.com (Gregory Kick)
34  */
35 public class Measurement implements Serializable {
36   private static final long serialVersionUID = 1L;
37 
indexByDescription( Iterable<Measurement> measurements)38   public static ImmutableListMultimap<String, Measurement> indexByDescription(
39       Iterable<Measurement> measurements) {
40     return Multimaps.index(measurements, new Function<Measurement, String>() {
41       @Override public String apply(Measurement input) {
42         return input.description;
43       }
44     });
45   }
46 
47   @ExcludeFromJson
48   private int id;
49   private Value value;
50   private double weight;
51   private String description;
52 
53   private Measurement() {
54     this.value = Value.DEFAULT;
55     this.weight = 0.0;
56     this.description = "";
57   }
58 
59   private Measurement(Builder builder) {
60     this.value = builder.value;
61     this.description = builder.description;
62     this.weight = builder.weight;
63   }
64 
65   @Override public boolean equals(Object obj) {
66     if (obj == this) {
67       return true;
68     } else if (obj instanceof Measurement) {
69       Measurement that = (Measurement) obj;
70       return this.value.equals(that.value)
71           && this.weight == that.weight
72           && this.description.equals(that.description);
73     } else {
74       return false;
75     }
76   }
77 
78   @Override public int hashCode() {
79     return Objects.hashCode(value, weight, description);
80   }
81 
82   @Override public String toString() {
83     return MoreObjects.toStringHelper(this)
84         .add("value", value)
85         .add("weight", weight)
86         .add("description", description)
87         .toString();
88   }
89 
90   public Value value() {
91     return value;
92   }
93 
94   public double weight() {
95     return weight;
96   }
97 
98   public String description() {
99     return description;
100   }
101 
102   public static final class Builder {
103     private Value value;
104     private Double weight;
105     private String description;
106 
107     public Builder value(Value value) {
108       this.value = checkNotNull(value);
109       return this;
110     }
111 
112     public Builder weight(double weight) {
113       checkArgument(weight > 0);
114       this.weight = weight;
115       return this;
116     }
117 
118     public Builder description(String description) {
119       this.description = checkNotNull(description);
120       return this;
121     }
122 
123     public Measurement build() {
124       checkArgument(value != null);
125       checkArgument(weight != null);
126       checkArgument(description != null);
127       return new Measurement(this);
128     }
129   }
130 }
131