2 * Copyright (c) 2002 Sergey Chaban <serge@wildwestsoftware.com>
7 using System
.Collections
;
8 using System
.Runtime
.InteropServices
;
10 namespace Mono
.PEToolkit
.Metadata
{
12 public interface MDTable
{
14 /// Number of rows in the table.
16 int NumberOfRows {get;}
19 /// Gets ot sets a row in the metadata table.
21 Row
this [int rowNum
] {get; set;}
25 void FromRawData(byte [] buff
, int offs
, int numRows
);
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();
46 if (heap
is TablesHeap
) {
47 (heap
as TablesHeap
).RegisterTable(this);
51 public virtual int NumberOfRows
{
58 public virtual Row
this [int rowNum
] {
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
;
67 rows
.Insert(rowNum
, value);
71 public virtual void Add(Row 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
{
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
);
94 foreach (Row row
in rows
) {
96 writer
.WriteLine("Row #{0}", n
++);
97 writer
.WriteLine("-------------");