Code/IdStack.cs
using System;
using System.Collections.Generic;

namespace Duccsoft.ImGui;

public class IdStack
{
	private struct HashData
	{
		public HashData( string id )
		{
			StringSource = id;
		}

		public HashData( int id )
		{
			IntSource = id;
		}

		public string StringSource { get; set; }
		public int IntSource { get; set; }
		
		public override int GetHashCode()
		{
			return HashCode.Combine( StringSource, IntSource );
		}
	}

	private Stack<HashData> _data = new();
	private Stack<int> _hashes = new();
	private int GetSeed()
	{
		if ( _hashes.Count == 0 )
		{
			return 0;
		}
		else
		{
			return _hashes.Peek();
		}
	}

	public void Clear()
	{
		_data.Clear();
		_hashes.Clear();
	}

	public int GetHash( string id ) => HashCode.Combine( GetSeed(), id );
	public int GetHash( int id ) => HashCode.Combine( GetSeed(), id );
	private int GetHash( HashData id ) => HashCode.Combine( GetSeed(), id.GetHashCode() );

	public void Push( string id ) => Push( new HashData( id ) );
	public void Push( int id ) => Push( new HashData( id ) );
	private void Push( HashData data )
	{
		_data.Push( data );
		var hash = GetHash( data );
		_hashes.Push( hash );
	}

	public void Pop()
	{
		_data.Pop();
		_hashes.Pop();
	}

}