Remove and optimize more Copy()s

This commit is contained in:
Alfonso Acosta
2016-08-02 12:42:26 +00:00
parent bdd09d8aa9
commit 5d857d05d6
6 changed files with 14 additions and 91 deletions

View File

@@ -226,7 +226,7 @@ func children(r report.Report, n report.Node) []NodeSummaryGroup {
for _, spec := range nodeSummaryGroupSpecs {
if len(summaries[spec.topologyID]) > 0 {
sort.Sort(nodeSummariesByID(summaries[spec.TopologyID]))
group := spec.NodeSummaryGroup.Copy()
group := spec.NodeSummaryGroup
group.Nodes = summaries[spec.topologyID]
nodeSummaryGroups = append(nodeSummaryGroups, group)
}

View File

@@ -32,19 +32,6 @@ type NodeSummaryGroup struct {
Columns []Column `json:"columns"`
}
// Copy returns a value copy of the NodeSummaryGroup
func (g NodeSummaryGroup) Copy() NodeSummaryGroup {
result := NodeSummaryGroup{
TopologyID: g.TopologyID,
Label: g.Label,
Columns: g.Columns,
}
for _, node := range g.Nodes {
result.Nodes = append(result.Nodes, node.Copy())
}
return result
}
// Column provides special json serialization for column ids, so they include
// their label for the frontend.
type Column struct {
@@ -94,35 +81,12 @@ func MakeNodeSummary(r report.Report, n report.Node) (NodeSummary, bool) {
// SummarizeMetrics returns a copy of the NodeSummary where the metrics are
// replaced with their summaries
func (n NodeSummary) SummarizeMetrics() NodeSummary {
cp := n.Copy()
for i, m := range cp.Metrics {
cp.Metrics[i] = m.Summary()
summarizedMetrics := make([]report.MetricRow, len(n.Metrics))
for i, m := range n.Metrics {
summarizedMetrics[i] = m.Summary()
}
return cp
}
// Copy returns a value copy of the NodeSummary
func (n NodeSummary) Copy() NodeSummary {
result := NodeSummary{
ID: n.ID,
Label: n.Label,
LabelMinor: n.LabelMinor,
Rank: n.Rank,
Shape: n.Shape,
Stack: n.Stack,
Linkable: n.Linkable,
Adjacency: n.Adjacency.Copy(),
}
for _, row := range n.Metadata {
result.Metadata = append(result.Metadata, row.Copy())
}
for _, table := range n.Tables {
result.Tables = append(result.Tables, table.Copy())
}
for _, row := range n.Metrics {
result.Metrics = append(result.Metrics, row.Copy())
}
return result
n.Metrics = summarizedMetrics
return n
}
func baseNodeSummary(r report.Report, n report.Node) NodeSummary {
@@ -134,7 +98,7 @@ func baseNodeSummary(r report.Report, n report.Node) NodeSummary {
Metadata: NodeMetadata(r, n),
Metrics: NodeMetrics(r, n),
Tables: NodeTables(r, n),
Adjacency: n.Adjacency.Copy(),
Adjacency: n.Adjacency,
}
}
@@ -372,15 +336,6 @@ func Summaries(r report.Report, rns report.Nodes) NodeSummaries {
return result
}
// Copy returns a deep value-copy of NodeSummaries
func (n NodeSummaries) Copy() NodeSummaries {
result := NodeSummaries{}
for k, v := range n {
result[k] = v.Copy()
}
return result
}
// getRenderableContainerName obtains a user-friendly container name, to render in the UI
func getRenderableContainerName(nmd report.Node) string {
for _, key := range []string{

View File

@@ -25,7 +25,7 @@ func TestTopoDiff(t *testing.T) {
Pseudo: false,
Adjacency: report.MakeIDList("nodeb"),
}
nodeap := nodea.Copy()
nodeap := nodea
nodeap.Adjacency = report.MakeIDList("nodeb", "nodeq") // not the same anymore
nodeb := detailed.NodeSummary{
ID: "nodeb",

View File

@@ -27,21 +27,13 @@ type MetricRow struct {
// Summary returns a copy of the MetricRow, without the samples, just the value if there is one.
func (m MetricRow) Summary() MetricRow {
row := m.Copy()
if m.Metric != nil {
row.Metric.Samples = nil
if m.Metric.Len() > 0 {
// shallow-copy
metricCopy := *m.Metric
metricCopy.Samples = nil
m.Metric = &metricCopy
}
return row
}
// Copy returns a value copy of the MetricRow
func (m MetricRow) Copy() MetricRow {
row := m
if m.Metric != nil {
var metric = m.Metric.Copy()
row.Metric = &metric
}
return row
return m
}
// MarshalJSON shouldn't be used, use CodecEncodeSelf instead

View File

@@ -94,16 +94,6 @@ func MakeMetric(samples []Sample) Metric {
}
}
// Copy returns a copy of the Metric.
func (m Metric) Copy() Metric {
c := m
if c.Samples != nil {
c.Samples = make([]Sample, len(m.Samples))
copy(c.Samples, m.Samples)
}
return c
}
// WithMax returns a fresh copy of m, with Max set to max
func (m Metric) WithMax(max float64) Metric {
return Metric{

View File

@@ -122,20 +122,6 @@ func TestMetricMerge(t *testing.T) {
}
}
func TestMetricCopy(t *testing.T) {
want := report.MakeMetric(nil)
have := want.Copy()
if !reflect.DeepEqual(want, have) {
t.Errorf("diff: %s", test.Diff(want, have))
}
want = report.MakeSingletonMetric(time.Now(), 1)
have = want.Copy()
if !reflect.DeepEqual(want, have) {
t.Errorf("diff: %s", test.Diff(want, have))
}
}
func TestMetricDiv(t *testing.T) {
t1 := time.Now()
t2 := time.Now().Add(1 * time.Minute)