File: ConfigureGoHCPP.cmake

package info (click to toggle)
mlpack 4.7.0-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 32,064 kB
  • sloc: cpp: 233,202; python: 1,940; sh: 1,201; lisp: 414; makefile: 85
file content (90 lines) | stat: -rw-r--r-- 3,100 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# ConfigureGoHCPP.cmake: generate an mlpack .h/.cpp file for a Go binding given
# input arguments.
#
# This file depends on the following variables being set:
#
#  * PROGRAM_NAME: name of the binding
#  * PROGRAM_MAIN_FILE: the file containing the mlpackMain() function.
#  * GO_IN: path of the go_method.h.in/go_method.cpp.in file.
#  * GO_OUT: name of the output .h/.cpp file.
#
include("${SOURCE_DIR}/CMake/StripType.cmake")
strip_type("${PROGRAM_MAIN_FILE}")

# Now, generate the definitions of the functions we need.
set(MODEL_PTR_DEFNS "")
set(MODEL_PTR_IMPLS "")
list(LENGTH MODEL_TYPES NUM_MODEL_TYPES)
if (${NUM_MODEL_TYPES} GREATER 0)
  math(EXPR LOOP_MAX "${NUM_MODEL_TYPES}-1")
  foreach (INDEX RANGE ${LOOP_MAX})
    list(GET MODEL_TYPES ${INDEX} MODEL_TYPE)
    list(GET MODEL_SAFE_TYPES ${INDEX} MODEL_SAFE_TYPE)

    # Generate the definition.
    set(MODEL_PTR_DEFNS "${MODEL_PTR_DEFNS}
// Set the pointer to a ${MODEL_TYPE} parameter.
extern void mlpackSet${MODEL_SAFE_TYPE}Ptr(void* params,
                                           const char* identifier,
                                           void* value);

// Get the pointer to a ${MODEL_TYPE} parameter.
extern void* mlpackGet${MODEL_SAFE_TYPE}Ptr(void* params,
                                            const char* identifier);
"
)

    # Generate the implementation.
    set(MODEL_PTR_IMPLS "${MODEL_PTR_IMPLS}
// Set the pointer to a ${MODEL_TYPE} parameter.
extern \"C\"  void mlpackSet${MODEL_SAFE_TYPE}Ptr(
    void* params,
    const char* identifier,
    void* value)
{
  util::Params& p = *((util::Params*) params);
  mlpack::util::SetParamPtr<${MODEL_TYPE}>(p, identifier,
      static_cast<${MODEL_TYPE}*>(value));
}

// Get the pointer to a ${MODEL_TYPE} parameter.
extern \"C\" void *mlpackGet${MODEL_SAFE_TYPE}Ptr(
    void* params,
    const char* identifier)
{
  util::Params& p = *((util::Params*) params);
  ${MODEL_TYPE} *modelptr = p.Get<${MODEL_TYPE}*>(identifier);
  return modelptr;
}
")
  endforeach ()
endif()

# Convert ${PROGRAM_NAME} from snake_case to CamelCase.
string(LENGTH ${PROGRAM_NAME} NUM_MODEL_CHAR)
if (${NUM_MODEL_CHAR} GREATER 0)
  math(EXPR LAST_CHAR_INDEX "${NUM_MODEL_CHAR}-2")
  string(SUBSTRING ${PROGRAM_NAME} "0" "1" MODEL_CHAR)
  string(TOUPPER ${MODEL_CHAR} MODEL_CHAR)
  string(APPEND GOPROGRAM_NAME ${MODEL_CHAR})
  foreach (INDEX0 RANGE ${LAST_CHAR_INDEX})
    math(EXPR INDEX0 "${INDEX0}+1") 
    math(EXPR INDEX1 "${INDEX0}+1")
    math(EXPR INDEX2 "${INDEX0}-1")
    string(SUBSTRING "${PROGRAM_NAME}" "${INDEX0}" "1" MODEL_CHAR1)
    string(SUBSTRING "${PROGRAM_NAME}" "${INDEX1}" "1" MODEL_CHAR2)
    string(SUBSTRING "${PROGRAM_NAME}" "${INDEX2}" "1" MODEL_CHAR3)
    if ("${MODEL_CHAR1}" MATCHES "_")
       string(TOUPPER ${MODEL_CHAR2} MODEL_CHAR2)
       string(APPEND GOPROGRAM_NAME ${MODEL_CHAR2})
       set(INDEX0 ${INDEX1})
    elseif ("${MODEL_CHAR3}" MATCHES "_")
       continue()
    else()
       string(APPEND GOPROGRAM_NAME ${MODEL_CHAR1})
    endif()
   endforeach()
endif()

# Now configure the files.
configure_file("${GO_IN}" "${GO_OUT}")