﻿[
  {
    HintName: ProxyInterfaceSourceGeneratorTests.Source.IFoo3Proxy.g.cs,
    Source:
//----------------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by https://github.com/specklesystems/ProxyGenerator.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//----------------------------------------------------------------------------------------

#nullable enable
using System;

namespace ProxyInterfaceSourceGeneratorTests.Source
{
    public partial interface IFoo3Proxy : global::ProxyInterfaceSourceGeneratorTests.Source.IFoo3
    {
        global::ProxyInterfaceSourceGeneratorTests.Source.Foo3 _Instance { get; }


    }
}
#nullable restore
  },
  {
    HintName: ProxyInterfaceSourceGeneratorTests.Source.IBar3Proxy.g.cs,
    Source:
//----------------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by https://github.com/specklesystems/ProxyGenerator.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//----------------------------------------------------------------------------------------

#nullable enable
using System;

namespace ProxyInterfaceSourceGeneratorTests.Source
{
    public partial interface IBar3Proxy : global::ProxyInterfaceSourceGeneratorTests.Source.IBar3
    {
        global::ProxyInterfaceSourceGeneratorTests.Source.Bar3 _Instance { get; }


    }
}
#nullable restore
  },
  {
    HintName: ProxyInterfaceSourceGeneratorTests.Source.Foo3Proxy.g.cs,
    Source:
//----------------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by https://github.com/specklesystems/ProxyGenerator.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//----------------------------------------------------------------------------------------

#nullable enable
using System;

namespace ProxyInterfaceSourceGeneratorTests.Source
{
    public partial class Foo3Proxy : global::ProxyInterfaceSourceGeneratorTests.Source.IFoo3
    {
        public global::ProxyInterfaceSourceGeneratorTests.Source.Foo3 _Instance { get; }
        
        public global::ProxyInterfaceSourceGeneratorTests.Source.IBar3 Weird()
        {
            var result_867036441 = _Instance.Weird();
            return Mapster.TypeAdapter.Adapt<global::ProxyInterfaceSourceGeneratorTests.Source.IBar3>(result_867036441);
        }


        public Foo3Proxy(global::ProxyInterfaceSourceGeneratorTests.Source.Foo3 instance)
        {
            _Instance = instance;
            
        }

        static Foo3Proxy()
        {
            Mapster.TypeAdapterConfig<global::ProxyInterfaceSourceGeneratorTests.Source.Bar3, global::ProxyInterfaceSourceGeneratorTests.Source.IBar3>.NewConfig().ConstructUsing(instance969373361 => new global::ProxyInterfaceSourceGeneratorTests.Source.Bar3Proxy(instance969373361));
            Mapster.TypeAdapterConfig<global::ProxyInterfaceSourceGeneratorTests.Source.IBar3, global::ProxyInterfaceSourceGeneratorTests.Source.Bar3>.NewConfig().MapWith(proxy339001485 => ((global::ProxyInterfaceSourceGeneratorTests.Source.Bar3Proxy) proxy339001485)._Instance);
        }
            
    }
}
#nullable restore
  },
  {
    HintName: ProxyInterfaceSourceGeneratorTests.Source.Bar3Proxy.g.cs,
    Source:
//----------------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by https://github.com/specklesystems/ProxyGenerator.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//----------------------------------------------------------------------------------------

#nullable enable
using System;

namespace ProxyInterfaceSourceGeneratorTests.Source
{
    public partial class Bar3Proxy : global::ProxyInterfaceSourceGeneratorTests.Source.IBar3
    {
        public global::ProxyInterfaceSourceGeneratorTests.Source.Bar3 _Instance { get; }
        

        public Bar3Proxy(global::ProxyInterfaceSourceGeneratorTests.Source.Bar3 instance)
        {
            _Instance = instance;
            
        }

        static Bar3Proxy()
        {
            Mapster.TypeAdapterConfig<global::ProxyInterfaceSourceGeneratorTests.Source.Bar3, global::ProxyInterfaceSourceGeneratorTests.Source.IBar3>.NewConfig().ConstructUsing(instance969373361 => new global::ProxyInterfaceSourceGeneratorTests.Source.Bar3Proxy(instance969373361));
            Mapster.TypeAdapterConfig<global::ProxyInterfaceSourceGeneratorTests.Source.IBar3, global::ProxyInterfaceSourceGeneratorTests.Source.Bar3>.NewConfig().MapWith(proxy339001485 => ((global::ProxyInterfaceSourceGeneratorTests.Source.Bar3Proxy) proxy339001485)._Instance);
        }
            
    }
}
#nullable restore
  },
  {
    HintName: Speckle.ProxyGenerator.Extra.g.cs,
    Source:
//----------------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by https://github.com/specklesystems/ProxyGenerator
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//----------------------------------------------------------------------------------------

#nullable enable
using System;

namespace Speckle.ProxyGenerator
{
    [AttributeUsage(AttributeTargets.Interface)]
    internal sealed class ProxyAttribute : Attribute
    {
        public Type Type { get; }
        public ImplementationOptions Options { get; }
        public ProxyClassAccessibility Accessibility { get; }
        public string[]? MembersToIgnore { get; }

        public ProxyAttribute(Type type) : this(type, ImplementationOptions.None, ProxyClassAccessibility.Public)
        {
        }

        public ProxyAttribute(Type type, ImplementationOptions options) : this(type, options, ProxyClassAccessibility.Public)
        {
        }

       	public ProxyAttribute(Type type, ProxyClassAccessibility accessibility) : this(type, ImplementationOptions.None, accessibility)
        {
        }

        public ProxyAttribute(Type type, ImplementationOptions options, ProxyClassAccessibility accessibility) : this(type, options, accessibility, null)
        {
        }

        public ProxyAttribute(Type type, string[]? membersToIgnore) : this(type, ImplementationOptions.None, ProxyClassAccessibility.Public, null)
        {
        }

        public ProxyAttribute(Type type, ImplementationOptions options, string[]? membersToIgnore) : this(type, options, ProxyClassAccessibility.Public, null)
        {
        }

        public ProxyAttribute(Type type, ImplementationOptions options, ProxyClassAccessibility accessibility, string[]? membersToIgnore)
        {
            Type = type;
            Options = options;
            Accessibility = accessibility;
            MembersToIgnore = membersToIgnore;
        }
    }

    [Flags]
    internal enum ProxyClassAccessibility
    {
        Public = 0,

        Internal = 1
    }
    [Flags]
    internal enum ImplementationOptions
    {
        None = 0,

        ProxyBaseClasses = 1,

        ProxyInterfaces = 2,

        UseExtendedInterfaces = 4,

        ProxyForBaseInterface = 8
    }

    public static class ProxyMap
    {
      private static readonly global::System.Collections.Concurrent.ConcurrentDictionary<Type, Type> s_revitToInterfaceMap = new();
      private static readonly global::System.Collections.Concurrent.ConcurrentDictionary<Type, Type> s_proxyToInterfaceMap = new();
      private static readonly global::System.Collections.Concurrent.ConcurrentDictionary<Type, Type> s_interfaceToRevit = new();
      private static readonly global::System.Collections.Concurrent.ConcurrentDictionary<Type, Func<object, object>> s_proxyFactory = new();

      static ProxyMap()
      {
        Add<ProxyInterfaceSourceGeneratorTests.Source.Foo3, global::ProxyInterfaceSourceGeneratorTests.Source.IFoo3, ProxyInterfaceSourceGeneratorTests.Source.Foo3Proxy>(x => new ProxyInterfaceSourceGeneratorTests.Source.Foo3Proxy(x));
Add<ProxyInterfaceSourceGeneratorTests.Source.Bar3, global::ProxyInterfaceSourceGeneratorTests.Source.IBar3, ProxyInterfaceSourceGeneratorTests.Source.Bar3Proxy>(x => new ProxyInterfaceSourceGeneratorTests.Source.Bar3Proxy(x));

      }

      private static void Add<T, TInterface, TProxy>(Func<T, TProxy> f)
        where TInterface : notnull
        where TProxy : TInterface
      {
        s_revitToInterfaceMap.TryAdd(typeof(T), typeof(TInterface));
        s_proxyToInterfaceMap.TryAdd(typeof(TProxy), typeof(TInterface));
        s_proxyFactory.TryAdd(typeof(TInterface), w => f((T)w));
        s_interfaceToRevit.TryAdd(typeof(TInterface), typeof(T));
      }

      public static Type? GetMappedTypeFromHostType(Type type)
      {
        if (s_revitToInterfaceMap.TryGetValue(type, out var t))
        {
          return t;
        }
        return null;
      }

      public static Type? GetMappedTypeFromProxyType(Type type)
      {
        if (s_proxyToInterfaceMap.TryGetValue(type, out var t))
        {
          return t;
        }

        return null;
      }

      public static Type? GetHostTypeFromMappedType(Type type)
      {
        if (s_interfaceToRevit.TryGetValue(type, out var t))
        {
          return t;
        }

        return null;
      }

      public static object CreateProxy(Type type, object toWrap) => s_proxyFactory[type](toWrap);
      public static T CreateProxy<T>(object toWrap) => (T)CreateProxy(typeof(T), toWrap);
    }
    public static class MapsterAdapter
    {
        public static TDestination? AdaptNull<TDestination>(object? source)
        {
            if (source is null)
            {
                return default;
            }

            return Mapster.TypeAdapter.Adapt<TDestination>(source);
        }
    }
#nullable restore
}
  }
]