blob: 15a6a04db2fc6fb3397f310deac25ff306054f8d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2018 Red Hat, Inc.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Elliott Baron <ebaron@redhat.com> - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.valgrind.massif;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
public class MassifHeapTreeNode {
protected MassifHeapTreeNode parent;
protected String text;
protected double percent;
protected long bytes;
protected String address;
protected String function;
protected String filename;
protected int line;
protected List<MassifHeapTreeNode> children;
public MassifHeapTreeNode(MassifHeapTreeNode parent, double percent, long bytes, String address, String function, String filename, int line) {
this.parent = parent;
StringBuilder nodeText = new StringBuilder();
formatBytes(percent, bytes, nodeText);
nodeText.append(address).append(":"); //$NON-NLS-1$
if (function.length() > 0) {
nodeText.append(" "); //$NON-NLS-1$
nodeText.append(function);
}
if (filename != null) {
nodeText.append(" (").append(filename); //$NON-NLS-1$
if (line > 0) {
nodeText.append(":").append(line);//$NON-NLS-1$
}
nodeText.append(")"); //$NON-NLS-1$
}
this.percent = percent;
this.bytes = bytes;
this.address = address;
this.function = function;
this.filename = filename;
this.line = line;
this.text = nodeText.toString();
children = new ArrayList<>();
}
public MassifHeapTreeNode(MassifHeapTreeNode parent, double percent, long bytes, String text) {
this.parent = parent;
StringBuilder nodeText = new StringBuilder();
formatBytes(percent, bytes, nodeText);
nodeText.append(text);
this.percent = percent;
this.bytes = bytes;
this.address = null;
this.function = null;
this.filename = null;
this.line = 0;
this.text = nodeText.toString();
children = new ArrayList<>();
}
private void formatBytes(double percent, long bytes, StringBuilder buffer) {
buffer.append(new DecimalFormat("0.##").format(percent) + "%"); //$NON-NLS-1$ //$NON-NLS-2$
buffer.append(" ("); //$NON-NLS-1$
buffer.append(new DecimalFormat("#,##0").format(bytes) + "B"); //$NON-NLS-1$ //$NON-NLS-2$
buffer.append(") "); //$NON-NLS-1$
}
public void addChild(MassifHeapTreeNode child) {
children.add(child);
}
public MassifHeapTreeNode getParent() {
return parent;
}
public MassifHeapTreeNode[] getChildren() {
return children.toArray(new MassifHeapTreeNode[children.size()]);
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public double getPercent() {
return percent;
}
public long getBytes() {
return bytes;
}
public String getAddress() {
return address;
}
public String getFunction() {
return function;
}
public String getFilename() {
return filename;
}
public int getLine() {
return line;
}
@Override
public String toString() {
return text;
}
public boolean hasSourceFile() {
return filename != null && line > 0;
}
@Override
public boolean equals(Object obj) {
return obj instanceof MassifHeapTreeNode
&& text.equals(((MassifHeapTreeNode) obj).getText());
}
@Override
public int hashCode() {
return text.hashCode();
}
}