From 54e38c692a94b52b8c7ee37bb50089f759905eae Mon Sep 17 00:00:00 2001 From: Corentin Le Molgat Date: Thu, 27 Dec 2018 16:47:59 +0100 Subject: [PATCH] .Net: Add support for delegate function as TransitCallback (Fix #997) --- .../constraint_solver/csharp/SolverHelper.cs | 3 +++ ortools/constraint_solver/csharp/routing.i | 11 +++++++++++ .../constraint_solver/csharp/routing_types.i | 18 ++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/ortools/constraint_solver/csharp/SolverHelper.cs b/ortools/constraint_solver/csharp/SolverHelper.cs index d2ac15e88f..87fc0af371 100644 --- a/ortools/constraint_solver/csharp/SolverHelper.cs +++ b/ortools/constraint_solver/csharp/SolverHelper.cs @@ -15,6 +15,9 @@ namespace Google.OrTools.ConstraintSolver { using System; using System.Collections.Generic; +public delegate long TransitCallback(long FromIndex, long ToIndex); +public delegate long UnaryTransitCallback(long FromIndex); + public partial class Solver : IDisposable { public IntVar[] MakeIntVarArray(int count, long min, long max) { IntVar[] array = new IntVar[count]; diff --git a/ortools/constraint_solver/csharp/routing.i b/ortools/constraint_solver/csharp/routing.i index 2ffc876aaf..f2d1c85f86 100644 --- a/ortools/constraint_solver/csharp/routing.i +++ b/ortools/constraint_solver/csharp/routing.i @@ -77,6 +77,17 @@ class RoutingSearchParameters; self->AddVectorDimension(values.data(), capacity, fix_start_cumul_to_zero, name); } + + int RegisterTransitCallback(operations_research::TransitCallback c) { + return $self->RegisterTransitCallback([c](int64 i, int64 j) { + return (*c)(i, j); + }); + } + int RegisterUnaryTransitCallback(operations_research::UnaryTransitCallback c) { + return $self->RegisterUnaryTransitCallback([c](int64 i) { + return (*c)(i); + }); + } } %rename("%(camelcase)s", %$isfunction) ""; diff --git a/ortools/constraint_solver/csharp/routing_types.i b/ortools/constraint_solver/csharp/routing_types.i index af0e2ae985..8f2f9f6bbb 100644 --- a/ortools/constraint_solver/csharp/routing_types.i +++ b/ortools/constraint_solver/csharp/routing_types.i @@ -77,3 +77,21 @@ DEFINE_INDEX_TYPE(operations_research::RoutingDisjunctionIndex); DEFINE_INDEX_TYPE(operations_research::RoutingVehicleClassIndex); %include "ortools/constraint_solver/routing_types.h" + +%{ +namespace operations_research { + typedef int64 (*TransitCallback)(int64, int64); + typedef int64 (*UnaryTransitCallback)(int64); +} // namespace operations_research +%} + +%define %DEFINE_CALLBACK(TYPE, CSTYPE) + %typemap(ctype) TYPE, TYPE& "void*" + %typemap(in) TYPE %{ $1 = (TYPE)$input; %} + %typemap(in) TYPE& %{ $1 = (TYPE*)&$input; %} + %typemap(imtype, out="IntPtr") TYPE, TYPE& "CSTYPE" + %typemap(cstype, out="IntPtr") TYPE, TYPE& "CSTYPE" + %typemap(csin) TYPE, TYPE& "$csinput" +%enddef +%DEFINE_CALLBACK(operations_research::TransitCallback, TransitCallback) +%DEFINE_CALLBACK(operations_research::UnaryTransitCallback, UnaryTransitCallback)