74 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using CppAst;
 | 
						|
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.Linq;
 | 
						|
using System.Text;
 | 
						|
using System.Threading.Tasks;
 | 
						|
 | 
						|
namespace refl
 | 
						|
{
 | 
						|
    internal class OverTree
 | 
						|
    {
 | 
						|
        public const int PrefixSize = 6;
 | 
						|
        List<int> Ctors = new List<int>();
 | 
						|
        List<int> Funcs = new List<int>();
 | 
						|
        private bool isInit = false;
 | 
						|
        public OverTree() { }
 | 
						|
        public void Init(CppClass cppClass)
 | 
						|
        {
 | 
						|
            if (isInit)
 | 
						|
            {
 | 
						|
                return;
 | 
						|
            }
 | 
						|
            isInit = true;
 | 
						|
            foreach (var types in cppClass.Typedefs)
 | 
						|
            {
 | 
						|
                string key = types.Name.Substring(0, PrefixSize);
 | 
						|
                if(key == "__Ctor")
 | 
						|
                {
 | 
						|
                    Ctors.Add(int.Parse(types.Name.Substring(PrefixSize)));
 | 
						|
                }
 | 
						|
                else if(key == "__Func")
 | 
						|
                {
 | 
						|
                    Funcs.Add(int.Parse(types.Name.Substring(PrefixSize)));
 | 
						|
                }
 | 
						|
            }
 | 
						|
            Ctors.Sort();
 | 
						|
            Funcs.Sort();
 | 
						|
        }
 | 
						|
        public void Clear()
 | 
						|
        {
 | 
						|
            Ctors.Clear();
 | 
						|
            Funcs.Clear();
 | 
						|
            isInit = false;
 | 
						|
        }
 | 
						|
        public string Find(string name)
 | 
						|
        {
 | 
						|
            string key = name.Substring(0, PrefixSize);
 | 
						|
            int v = int.Parse(name.Substring(PrefixSize));
 | 
						|
            if (key == "__Ctor")
 | 
						|
            {
 | 
						|
                v = FindValue(Ctors, v);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                v = FindValue(Funcs, v);
 | 
						|
            }
 | 
						|
            return key + v;
 | 
						|
        }
 | 
						|
        private static int FindValue(List<int> sortedNumbers, int target)
 | 
						|
        {
 | 
						|
            if(sortedNumbers.Count == 0)
 | 
						|
            {
 | 
						|
                return target;
 | 
						|
            }
 | 
						|
            int index = sortedNumbers.BinarySearch(target);
 | 
						|
            if(index < 0)
 | 
						|
            {
 | 
						|
                index = ~index;
 | 
						|
            }
 | 
						|
            index = index > 0 ? index - 1 : 0;
 | 
						|
            return sortedNumbers[index];
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |