blob: fcaddf58b799022f010c7c266e40aeb68ae5bea4 [file] [log] [blame]
// Copyright 2019 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.
/// Names and numbers from the VMO spec.
///
/// Defines BlockType enum.
///
/// Defines BitRange's for all the header and payload fields.
// ignore_for_file: prefer_constructors_over_static_methods
import 'bitfield64.dart';
/// Index of the one-and-only header block (16 bytes).
const int headerIndex = 0;
/// 'INSP' utf8 string (little endian) for HEADER block magic value.
const int headerMagicNumber = 0x50534e49;
/// Each increment of [index] is 16 bytes in the VMO.
const int bytesPerIndex = 16;
/// Version for HEADER block.
const int headerVersionNumber = 0;
/// Index of the one-and-only root node (16 bytes).
const int rootNodeIndex = 1;
/// Each Node needs a parent; Root's parent is 0, which is never a real node.
const int rootParentIndex = 0;
/// Index of the NAME of the one-and-only root node (32 bytes).
const int rootNameIndex = 2;
/// First index availalbe for the heap.
const int heapStartIndex = 4;
/// Size of VMO-block's header bitfield in bytes.
const int headerSizeBytes = 8;
/// Flag for utf8 Property.
const int propertyUtf8Flag = 0;
/// Flag for binary Property.
const int propertyBinaryFlag = 1;
/// Types of VMO blocks.
///
/// Basically an enum with conversion to/from specified numeric values.
class BlockType {
/// Gets the numeric [value] of this member.
final int value;
/// Printable [name] of the element.
final String name;
/// Contains all elements.
static const List<BlockType> values = [
free,
reserved,
header,
nodeValue,
intValue,
uintValue,
doubleValue,
propertyValue,
extent,
nameUtf8,
tombstone,
anyValue
];
@override
String toString() => name;
const BlockType._(this.value, this.name);
/// Empty block, ready to be used.
static const BlockType free = BlockType._(0, 'free');
/// In transition toward being used.
static const BlockType reserved = BlockType._(1, 'reserved');
/// One block to rule them all. Index 0.
static const BlockType header = BlockType._(2, 'header');
/// An entry in the Inspect tree, which may hold child Values: Nodes,
/// Metrics, or Properties.
static const BlockType nodeValue = BlockType._(3, 'nodeValue');
/// An int Metric.
static const BlockType intValue = BlockType._(4, 'intValue');
/// A uint Metric.
static const BlockType uintValue = BlockType._(5, 'uintValue');
/// A double Metric.
static const BlockType doubleValue = BlockType._(6, 'doubleValue');
/// The header of a string or byte-vector Property.
static const BlockType propertyValue = BlockType._(7, 'propertyValue');
/// The contents of a string Property (in a singly linked list, if necessary).
static const BlockType extent = BlockType._(8, 'extent');
/// The name of a Value (Property, Metric, or Node) stored as utf8.
///
/// Name must be contained in this one block. This may truncate utf8 strings
/// in the middle of a multibyte character.
static const BlockType nameUtf8 = BlockType._(9, 'nameUtf8');
/// A property that's been deleted but still has live children.
static const BlockType tombstone = BlockType._(10, 'tombstone');
/// *_VALUE type, for internal use.
///
/// Not valid if written to VMO.
static const BlockType anyValue = BlockType._(11, 'anyValue');
}
/// Order defines the block size: 1 << (order + 4).
final BitRange orderBits = BitRange(0, 3);
/// Type is one of the BlockType values.
final BitRange typeBits = BitRange(4, 7);
/// Version field of HEADER-type blocks.
final BitRange headerVersionBits = BitRange(8, 31);
/// "Magic" field of HEADER-type blocks.
final BitRange headerMagicBits = BitRange(32, 63);
/// NextFreeBlock field of FREE-type blocks.
final BitRange nextFreeBits = BitRange(8, 35);
/// Parent Index field of *_VALUE blocks.
final BitRange parentIndexBits = BitRange(8, 35);
/// Name Index field of *_VALUE blocks.
final BitRange nameIndexBits = BitRange(36, 63);
/// Total Length field of PROPERTY_VALUE blocks payload bits.
final BitRange propertyTotalLengthBits = BitRange(0, 31);
/// Extent Index field of PROPERTY_VALUE blocks payload bits.
final BitRange propertyExtentIndexBits = BitRange(32, 59);
/// Flags field of PROPERTY_VALUE blocks payload bits.
final BitRange propertyFlagsBits = BitRange(60, 63);
/// Next Extent field of EXTENT blocks.
final BitRange nextExtentBits = BitRange(8, 35);
/// Length field of NAME blocks.
final BitRange nameLengthBits = BitRange(8, 19);