public int DancingLinks(bool justOne, AnswerCallback cb) { ansCallback = cb; IntPtr callback = Marshal.GetFunctionPointerForDelegate(new SudokuLib.AnswerCallback(DancingCallback)); return(SudokuLib.DancingLinks(matrix, (byte)(justOne ? 1 : 0), callback, IntPtr.Zero)); }
public Sudoku(SudokuReadData readFunc, SudokuWriteData writeFunc, SolveProcessCallback procCallback) { if (readFunc == null || writeFunc == null) { throw new Exception("read function and write function should not be null!"); } IntPtr readPtr = Marshal.GetFunctionPointerForDelegate(new SudokuLib.SudokuReadData((IntPtr data, int row, int col) => { return(readFunc.Invoke(row, col)); })); IntPtr writePtr = Marshal.GetFunctionPointerForDelegate(new SudokuLib.SudokuWriteData((IntPtr data, int row, int col, int value, int type) => { writeFunc.Invoke(row, col, value, (SolveType)type); })); IntPtr solvePtr = Marshal.GetFunctionPointerForDelegate(new SudokuLib.SolveProcessCallback((IntPtr data, IntPtr proc) => { if (procCallback == null) { return; } SolveProcedure procedure = (SolveProcedure)Marshal.PtrToStructure(proc, typeof(SolveProcedure)); procCallback.Invoke(procedure); })); sudo = SudokuLib.CreateSudoku(readPtr, writePtr, solvePtr, IntPtr.Zero); }
public void SetMatrixRowData(int[] data) { IntPtr pData = Marshal.AllocHGlobal(sizeof(int) * data.Length); Marshal.Copy(data, 0, pData, data.Length); SudokuLib.SetMatrixRowData(matrix, pData, data.Length); Marshal.FreeHGlobal(pData); }
public string MakeResultString() { IntPtr pData = Marshal.AllocHGlobal(SudokuLib.RESULT_BUFFER_SIZE); SudokuLib.MakeResultString(sudo, pData, SudokuLib.RESULT_BUFFER_SIZE); string result = Marshal.PtrToStringAnsi(pData, SudokuLib.RESULT_BUFFER_SIZE); Marshal.FreeHGlobal(pData); return(result); }
public static bool VerifySudokuBoard(int[] board) { if (board.Length < SudokuLib.BOARD_SIZE) { return(false); } IntPtr pData = Marshal.AllocHGlobal(sizeof(int) * board.Length); Marshal.Copy(board, 0, pData, board.Length); int ret = (int)SudokuLib.VerifySudokuBoard(pData); Marshal.FreeHGlobal(pData); return(ret > 0); }
public int CalculateSudokuAll(bool dancing, SudokuAnswerCallback cb) { IntPtr ansPtr = Marshal.GetFunctionPointerForDelegate(new SudokuLib.AnswerCallback((IntPtr data, IntPtr answer, int size) => { if (cb == null) { return; } string result = Marshal.PtrToStringAnsi(answer, size); cb.Invoke(result); })); return(SudokuLib.CalculateSudokuAll(sudo, (byte)(dancing ? 1 : 0), ansPtr, IntPtr.Zero)); }
public BoolMatrix(int rows, int cols, int maxNodes) { matrix = SudokuLib.CreateBoolMatrix(rows, cols, maxNodes); }
public int GetKnownCount() { return(SudokuLib.GetKnownCount(sudo)); }
public bool VerifySudoku() { return(SudokuLib.VerifySudoku(sudo) > 0); }
public static string ImproveTypeName(ImproveType type) { IntPtr name = SudokuLib.ImproveTypeName((int)type); return(Marshal.PtrToStringAnsi(name)); }