**** Merged from MCS ****
[mono-project.git] / mcs / class / Mono.PEToolkit / metadata / MDTable.cs
blob418fcd219b5e908eb3ce377e6868829cebc85c87
1 /*
2 * Copyright (c) 2002 Sergey Chaban <serge@wildwestsoftware.com>
3 */
5 using System;
6 using System.IO;
7 using System.Collections;
8 using System.Runtime.InteropServices;
10 namespace Mono.PEToolkit.Metadata {
12 public interface MDTable {
13 /// <summary>
14 /// Number of rows in the table.
15 /// </summary>
16 int NumberOfRows {get;}
18 /// <summary>
19 /// Gets ot sets a row in the metadata table.
20 /// </summary>
21 Row this [int rowNum] {get; set;}
23 void Add(Row row);
25 void FromRawData(byte [] buff, int offs, int numRows);
27 string Name {get;}
29 TableId Id {get;}
31 MDHeap Heap {get;}
33 void Dump(TextWriter writer);
37 public abstract class MDTableBase : MDTable {
38 protected ArrayList rows; // rows storage
39 protected MDHeap heap; // base heap
41 public MDTableBase(MDHeap heap)
43 rows = new ArrayList();
44 this.heap = heap;
46 if (heap is TablesHeap) {
47 (heap as TablesHeap).RegisterTable(this);
51 public virtual int NumberOfRows {
52 get {
53 return rows.Count;
58 public virtual Row this [int rowNum] {
59 get {
60 if (rowNum < 0) throw new IndexOutOfRangeException("Row[]");
62 // Zero row, special case
63 if (rowNum == 0) return NullRow.Instance;
64 return rows [rowNum - 1] as Row;
66 set {
67 rows.Insert(rowNum, value);
71 public virtual void Add(Row row)
73 rows.Add(row);
76 public abstract void FromRawData(byte [] buff, int offs, int numRows);
78 public abstract string Name {get;}
80 public abstract TableId Id {get;}
82 public virtual MDHeap Heap {
83 get {
84 return heap;
88 public virtual void Dump(TextWriter writer)
90 writer.WriteLine("=========================================");
91 writer.WriteLine("Table '{0}', id = {1} (0x{2}), rows = {3}",
92 Name, Id, ((int) Id).ToString("X"), NumberOfRows);
93 int n = 1;
94 foreach (Row row in rows) {
95 writer.WriteLine();
96 writer.WriteLine("Row #{0}", n++);
97 writer.WriteLine("-------------");
98 row.Dump(writer);
99 writer.WriteLine();