Advertisement
Guest User

Untitled

a guest
Jan 14th, 2020
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
D 3.94 KB | None | 0 0
  1. enum string СгенерироватьКод(alias Тип, bool КодСервера)() {
  2.  
  3.     enum ulong ПолучитьИндекс(ulong ИндексИнтерфейса0 ,ulong ИндексМетода0, ulong ИндексФункции0) {
  4.         ulong Индекс;
  5.         static if(КодСервера) alias Интерфейс = InterfacesTuple!Тип[0];
  6.         else                  alias Интерфейс = Тип;
  7.         enum ulong ИндексИнтерфейса = 0;
  8.         //alias Интерфейсы = InterfacesTuple!Тип;
  9.         //foreach(ИндексИнтерфейса, Интерфейс; Интерфейсы) {
  10.             foreach(ИндексМетода, ИмяМетода; __traits(derivedMembers, Интерфейс)) {
  11.                 alias Функции     = __traits(getVirtualMethods, Интерфейс, ИмяМетода);
  12.                 alias ТипыФункций = typeof(Функции);
  13.                 foreach(ИндексФункции, ТипФункции; ТипыФункций) {
  14.                     if(ИндексИнтерфейса==ИндексИнтерфейса0 && ИндексМетода==ИндексМетода0 && ИндексФункции==ИндексФункции0) return Индекс;
  15.                     Индекс++;
  16.                 }
  17.             }
  18.         //}
  19.         return Индекс;
  20.     }
  21.  
  22.     static if(КодСервера) alias Интерфейс = InterfacesTuple!Тип[0];
  23.     else                  alias Интерфейс = Тип;
  24.     enum ulong ИндексИнтерфейса = 0;
  25.     string Код;
  26.     //alias Интерфейсы = InterfacesTuple!Тип;
  27.     //foreach(ИндексИнтерфейса, Интерфейс; Интерфейсы) {
  28.         foreach(ИндексМетода, ИмяМетода; __traits(derivedMembers, Интерфейс)) {
  29.             alias Функции     = __traits(getVirtualMethods, Интерфейс, ИмяМетода);
  30.             alias ТипыФункций = typeof(Функции);
  31.             foreach(ИндексФункции, ТипФункции; ТипыФункций) {
  32.  
  33.                 static if(КодСервера) enum string КодИнтерфейса = "InterfacesTuple!Тип[%s]".format(ИндексИнтерфейса);
  34.                 else                  enum string КодИнтерфейса = "Интерфейс";
  35.                 enum string КодИмениМетода       = "__traits(derivedMembers, %s)[%s]".format(КодИнтерфейса, ИндексМетода);
  36.                 enum string КодПараметровФункции = "typeof(__traits(getVirtualMethods, %s, %s)[%s])".format(КодИнтерфейса, КодИмениМетода, ИндексФункции);
  37.  
  38.                 enum string КодВыходногоТипа  = "ReturnType!(%s)".format(КодПараметровФункции);
  39.                 enum string КодКортежаВходныхТипов  = "Parameters!(%s)".format(КодПараметровФункции);
  40.                 enum auto   МассивВходныхИмён   = [ParameterIdentifierTuple!(Функции[ИндексФункции])];
  41.                 alias       ВыходнойТип      = ReturnType!ТипФункции;
  42.                 enum bool   ВозвращаетДанные = !is(ВыходнойТип==void);
  43.                 static if(КодСервера)
  44.                     enum string КодФункции = СгенерироватьУчастокКодаСервера(ПолучитьИндекс(ИндексИнтерфейса,ИндексМетода,ИндексФункции), ВозвращаетДанные, КодВыходногоТипа, ИмяМетода, КодКортежаВходныхТипов, МассивВходныхИмён);
  45.                 else
  46.                     enum string КодФункции = СгенерироватьКодФункцииКлиента(ПолучитьИндекс(ИндексИнтерфейса,ИндексМетода,ИндексФункции), ВозвращаетДанные, КодВыходногоТипа, ИмяМетода, КодКортежаВходныхТипов, МассивВходныхИмён);
  47.                 Код ~= КодФункции ~ "\n\n";
  48.             }
  49.         }
  50.     //}
  51.     return Код;
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement