using OpenCVForUnity.CoreModule;
using OpenCVForUnity.UtilsModule;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace OpenCVForUnity.Features2dModule
{

    // C++: class BFMatcher
    //javadoc: BFMatcher

    public class BFMatcher : DescriptorMatcher
    {

        protected override void Dispose (bool disposing)
        {
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
            try {
                if (disposing) {
                }
                if (IsEnabledDispose) {
                    if (nativeObj != IntPtr.Zero)
                        features2d_BFMatcher_delete (nativeObj);
                    nativeObj = IntPtr.Zero;
                }
            } finally {
                base.Dispose (disposing);
            }
#else
            return;
#endif
        }

        protected internal BFMatcher (IntPtr addr)
            : base (addr)
        {
        }

        // internal usage only
        public static new BFMatcher __fromPtr__ (IntPtr addr)
        {
            return new BFMatcher (addr);
        }

        //
        // C++:   cv::BFMatcher::BFMatcher(int normType = NORM_L2, bool crossCheck = false)
        //

        //javadoc: BFMatcher::BFMatcher(normType, crossCheck)
        public BFMatcher (int normType, bool crossCheck) :
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        base (features2d_BFMatcher_BFMatcher_10 (normType, crossCheck))
        
#else
            base (IntPtr.Zero)
#endif
        {

            return;

        }

        //javadoc: BFMatcher::BFMatcher(normType)
        public BFMatcher (int normType) :
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        base (features2d_BFMatcher_BFMatcher_11 (normType))
        
#else
            base (IntPtr.Zero)
#endif
        {

            return;

        }

        //javadoc: BFMatcher::BFMatcher()
        public BFMatcher () :
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        base (features2d_BFMatcher_BFMatcher_12 ())
        
#else
            base (IntPtr.Zero)
#endif
        {

            return;

        }


        //
        // C++: static Ptr_BFMatcher cv::BFMatcher::create(int normType = NORM_L2, bool crossCheck = false)
        //

        //javadoc: BFMatcher::create(normType, crossCheck)
        public static BFMatcher create (int normType, bool crossCheck)
        {
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
            BFMatcher retVal = BFMatcher.__fromPtr__ (features2d_BFMatcher_create_10 (normType, crossCheck));
        
            return retVal;
#else
            return null;
#endif
        }

        //javadoc: BFMatcher::create(normType)
        public static new BFMatcher create (int normType)
        {
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
            BFMatcher retVal = BFMatcher.__fromPtr__ (features2d_BFMatcher_create_11 (normType));
        
            return retVal;
#else
            return null;
#endif
        }

        //javadoc: BFMatcher::create()
        public static BFMatcher create ()
        {
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
            BFMatcher retVal = BFMatcher.__fromPtr__ (features2d_BFMatcher_create_12 ());
        
            return retVal;
#else
            return null;
#endif
        }


#if (UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR
        const string LIBNAME = "__Internal";
        
#else
        const string LIBNAME = "opencvforunity";
#endif



        // C++:   cv::BFMatcher::BFMatcher(int normType = NORM_L2, bool crossCheck = false)
        [DllImport (LIBNAME)]
        private static extern IntPtr features2d_BFMatcher_BFMatcher_10 (int normType, bool crossCheck);

        [DllImport (LIBNAME)]
        private static extern IntPtr features2d_BFMatcher_BFMatcher_11 (int normType);

        [DllImport (LIBNAME)]
        private static extern IntPtr features2d_BFMatcher_BFMatcher_12 ();

        // C++: static Ptr_BFMatcher cv::BFMatcher::create(int normType = NORM_L2, bool crossCheck = false)
        [DllImport (LIBNAME)]
        private static extern IntPtr features2d_BFMatcher_create_10 (int normType, bool crossCheck);

        [DllImport (LIBNAME)]
        private static extern IntPtr features2d_BFMatcher_create_11 (int normType);

        [DllImport (LIBNAME)]
        private static extern IntPtr features2d_BFMatcher_create_12 ();

        // native support for java finalize()
        [DllImport (LIBNAME)]
        private static extern void features2d_BFMatcher_delete (IntPtr nativeObj);

    }
}