﻿using System;

namespace Oni.Metadata
{
    internal class MetaVarArray : MetaType
    {
        private readonly MetaType elementType;
        private readonly Field lengthField;

        public MetaVarArray(MetaType lengthType, MetaType elementType)
        {
            if (lengthType != MetaType.Int16 && lengthType != MetaType.Int32)
                throw new ArgumentException("lengthType must be Int16 or Int32", "lengthType");

            this.lengthField = new Field(lengthType, "Length");
            this.elementType = elementType;

            Name = string.Format("{0}[{1}]", elementType.Name, lengthType.Name);
            Size = lengthType.Size;
        }

        public Field CountField => lengthField;

        public MetaType ElementType => elementType;

        protected override bool IsLeafImpl() => elementType.IsLeaf;

        public override void Accept(IMetaTypeVisitor visitor) => visitor.VisitVarArray(this);
    }
}
