File: Utils\Vec.cs
Web Access
Project: src\src\Microsoft.ML.Tokenizers\Microsoft.ML.Tokenizers.csproj (Microsoft.ML.Tokenizers)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System;
using System.Collections.Generic;
using System.Text;
 
namespace Microsoft.ML.Tokenizers
{
    internal struct Vec<T>
    {
        private const int DefaultCapacity = 10;
        private int _count;
        private T[]? _buffer;
 
        public ref T this[int index]
        {
            get
            {
                if (index >= _count)
                {
                    throw new ArgumentOutOfRangeException(nameof(index), $"{index} is out of range");
                }
                return ref _buffer![index];
            }
        }
 
        public Vec()
        {
            _count = 0;
            _buffer = null;
        }
 
        public Vec(int capacity)
        {
            _count = 0;
            _buffer = new T[capacity];
        }
 
        public int Capacity => _buffer is null ? 0 : _buffer.Length;
        public int Count => _count;
 
        public void Push(T t)
        {
            if (_buffer is null)
            {
                _buffer = new T[DefaultCapacity];
                _buffer[0] = t;
                _count = 1;
                return;
            }
 
            if (_buffer.Length <= _count)
            {
                Array.Resize(ref _buffer, _buffer.Length << 1);
            }
 
            _buffer[_count++] = t;
        }
 
        public void Remove(int index)
        {
            if (index >= _count || _buffer is null)
            {
                return;
            }
 
            for (int i = index; i < _count - 1; i++)
            {
                _buffer[i] = _buffer[i + 1];
            }
 
            _count--;
        }
 
        public void Clear() => _count = 0;
    }
}