blob: 8effce7ae4914f87754c169ad6981dd0014c2dcd [file] [log] [blame]
Paul Duffine2363012015-11-30 16:20:41 +00001/*
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
17package com.google.caliper.model;
18
19import static com.google.common.base.Preconditions.checkArgument;
20import static com.google.common.base.Preconditions.checkNotNull;
21
22import com.google.common.base.Function;
23import com.google.common.base.MoreObjects;
24import com.google.common.base.Objects;
25import com.google.common.collect.ImmutableListMultimap;
26import com.google.common.collect.Multimaps;
27
28import java.io.Serializable;
29
30/**
31 * A single, weighted measurement.
32 *
33 * @author gak@google.com (Gregory Kick)
34 */
35public class Measurement implements Serializable {
36 private static final long serialVersionUID = 1L;
37
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}