<!DOCTYPE html>
<!--
Copyright 2016 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->

<link rel="import" href="/tracing/base/iteration_helpers.html">
<link rel="import" href="/tracing/value/diagnostics/diagnostic.html">
<link rel="import" href="/tracing/value/diagnostics/value_ref.html">

<script>
'use strict';

tr.exportTo('tr.v.d', function() {
  class RelatedValueSet extends tr.v.d.Diagnostic {
    constructor(opt_values) {
      super();
      this.valuesByGuid_ = new Map();

      if (opt_values)
        for (var value of opt_values)
          this.add(value);
    }

    /**
     * @param {!(tr.v.d.ValueRef|tr.v.Histogram)} v
     */
    add(value) {
      if (!(value instanceof tr.v.Histogram) &&
          !(value instanceof tr.v.d.ValueRef))
        throw new Error('Must be instanceof Histogram or ValueRef: ' + value);

      if (this.valuesByGuid_.get(value.guid))
        throw new Error('Tried to add same value twice');

      this.valuesByGuid_.set(value.guid, value);
    }

    has(value) {
      return this.valuesByGuid_.has(value.guid);
    }

    get length() {
      return this.valuesByGuid_.size;
    }

    *[Symbol.iterator]() {
      for (var [guid, value] of this.valuesByGuid_)
        yield value;
    }

    /**
     * Resolve all ValueRefs into Values by looking up their guids in
     * |valueSet|.
     * If a value cannot be found and |opt_required| is true, then throw an
     * Error.
     * If a value cannot be found and |opt_required| is false, then the ValueRef
     * will remain a ValueRef.
     *
     * @param {!tr.v.ValueSet} valueSet
     * @param {boolean=} opt_required
     */
    resolve(valueSet, opt_required) {
      for (var [guid, value] of this.valuesByGuid_) {
        if (!(value instanceof tr.v.d.ValueRef))
          continue;

        value = valueSet.lookup(guid);
        if (value instanceof tr.v.Histogram)
          this.valuesByGuid_.set(guid, value);
        else if (opt_required)
          throw new Error('Unable to find Histogram ' + guid);
      }
    }

    asDictInto_(d) {
      d.guids = [];
      for (var value of this)
        d.guids.push(value.guid);
    }

    static fromDict(d) {
      return new RelatedValueSet(d.guids.map(
          guid => new tr.v.d.ValueRef(guid)));
    }
  }

  tr.v.d.Diagnostic.register(RelatedValueSet, {
    elementName: 'tr-v-ui-related-value-set-span'
  });

  return {
    RelatedValueSet: RelatedValueSet,
  };
});
</script>
