// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file

part of models;

enum ProfileTreeDirection { inclusive, exclusive }

abstract class SampleProfile {
  int get sampleCount;
  int get stackDepth;
  double get sampleRate;
  double get timeSpan;
  Iterable<ProfileCode> get codes;
  Iterable<ProfileFunction> get functions;

  FunctionCallTree loadFunctionTree(ProfileTreeDirection direction);
  CodeCallTree loadCodeTree(ProfileTreeDirection direction);
}

abstract class Profile {
  double get normalizedExclusiveTicks;
  double get normalizedInclusiveTicks;
}

abstract class ProfileCode extends Profile {
  CodeRef get code;
  Map<ProfileCode, int> get callers;
  Map<ProfileCode, int> get callees;
}

abstract class ProfileFunction extends Profile {
  FunctionRef get function;
  Map<ProfileFunction, int> get callers;
  Map<ProfileFunction, int> get callees;
}

typedef bool CallTreeNodeFilter(CallTreeNode);

abstract class CallTree {
  CallTree filtered(CallTreeNodeFilter filter);
}

abstract class CodeCallTree extends CallTree {
  CodeCallTreeNode get root;
  CodeCallTree filtered(CallTreeNodeFilter filter);
}

abstract class FunctionCallTree extends CallTree {
  FunctionCallTreeNode get root;
  FunctionCallTree filtered(CallTreeNodeFilter filter);
}

abstract class CallTreeNode {
  double get percentage;
  int get inclusiveNativeAllocations;
  int get exclusiveNativeAllocations;
  Iterable<CallTreeNode> get children;
}

abstract class CodeCallTreeNode extends CallTreeNode {
  ProfileCode get profileCode;
  Iterable<CodeCallTreeNode> get children;
}

abstract class FunctionCallTreeNode extends CallTreeNode {
  ProfileFunction get profileFunction;
  Iterable<FunctionCallTreeNode> get children;
}
