blob: 7279811e8da57479ccc8bc9793305d772ec8d5e0 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'node.dart';
/// Stores an order of nodes.
class EvaluationOrder {
final List<Node> nodes;
EvaluationOrder(this.nodes);
/// Builds an EvaluationOrder that consists of [graphNodes] in the order given
/// by [ids].
///
/// All [ids] must be distinct. Each element of [ids] must be presented among
/// nodeIds of [graphNodes]. If [allowPartial] is false, [ids] must contain
/// nodeId for each node from [graphNodes].
EvaluationOrder.fromIds(Iterable<String> ids, Iterable<Node> graphNodes,
{bool allowPartial = false, allowGenerated = false})
: nodes = <Node>[] {
final idToNode = new Map<String, Node>.fromIterable(graphNodes,
key: (node) => node.nodeId);
final setIds = ids.toSet();
if (setIds.length != ids.length) {
throw new ArgumentError('Elements of ids ($ids) must be unique.');
}
if (!allowPartial) {
for (final node in graphNodes) {
if (!setIds.contains(node.nodeId)) {
throw new ArgumentError(
'ids ($ids) must contain all nodes from `$graphNodes`.');
}
}
}
for (final id in ids) {
Node node = idToNode[id];
if (node == null) {
if (!allowGenerated || !id.startsWith('g-')) {
throw new ArgumentError(
'`$id` is not an id of a node from `$graphNodes`.');
}
// Can throw FormatException
int firstDash = 1;
int underscore = id.indexOf('_');
int secondDash = id.indexOf('-', underscore + 1);
int id1 = int.parse(id.substring(firstDash + 1, underscore));
int id2 = int.parse(id.substring(underscore + 1, secondDash));
node = new SynchronizationNode.generated(
id.substring(secondDash + 1), id1, id2);
}
nodes.add(node);
}
}
@override
String toString() {
StringBuffer nodesString = new StringBuffer()
..writeAll(nodes.map((node) => "'$node'"), ', ');
return '[$nodesString]';
}
@override
int get hashCode {
// TODO: implement hashCode with better collision rate.
return 0;
}
/// Compares nodes by nodeId.
@override
bool operator ==(dynamic other) {
if (nodes.length != other.nodes.length) {
return false;
}
for (int i = 0; i < nodes.length; i++) {
if (nodes[i].nodeId != other.nodes[i].nodeId) {
return false;
}
}
return true;
}
}