Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
tsoc
openmm
Commits
ce24d1bd
Commit
ce24d1bd
authored
Jul 17, 2009
by
Peter Eastman
Browse files
First checkin of scripts to generate C wrappers
parent
bc00090d
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
751 additions
and
0 deletions
+751
-0
wrappers/CWrapper_Header.xslt
wrappers/CWrapper_Header.xslt
+272
-0
wrappers/CWrapper_Source.xslt
wrappers/CWrapper_Source.xslt
+479
-0
No files found.
wrappers/CWrapper_Header.xslt
0 → 100644
View file @
ce24d1bd
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet
version=
"2.0"
xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"
>
<xsl:output
method=
"text"
omit-xml-declaration=
"yes"
/>
<xsl:variable
name=
"std_namespace_id"
select=
"/GCC_XML/Namespace[@name='std']/@id"
/>
<xsl:variable
name=
"openmm_namespace_id"
select=
"/GCC_XML/Namespace[@name='OpenMM']/@id"
/>
<xsl:variable
name=
"bool_type_id"
select=
"/GCC_XML/FundamentalType[@name='bool']/@id"
/>
<xsl:variable
name=
"string_type_id"
select=
"/GCC_XML/*[@name='string' and @context=$std_namespace_id]/@id"
/>
<xsl:variable
name=
"const_string_type_id"
select=
"/GCC_XML/CvQualifiedType[@type=$string_type_id]/@id"
/>
<xsl:variable
name=
"const_ref_string_type_id"
select=
"/GCC_XML/ReferenceType[@type=$const_string_type_id]/@id"
/>
<xsl:variable
name=
"vector_string_type_id"
select=
"/GCC_XML/Class[starts-with(@name, 'vector<std::basic_string')]/@id"
/>
<xsl:variable
name=
"vector_vec3_type_id"
select=
"/GCC_XML/Class[starts-with(@name, 'vector<OpenMM::Vec3')]/@id"
/>
<xsl:variable
name=
"vector_bond_type_id"
select=
"/GCC_XML/Class[starts-with(@name, 'vector<std::pair<int, int')]/@id"
/>
<xsl:variable
name=
"map_parameter_type_id"
select=
"/GCC_XML/Class[starts-with(@name, 'map<std::basic_string')]/@id"
/>
<!-- Do not generate functions for the following classes -->
<xsl:variable
name=
"skip_classes"
select=
"('Vec3', 'Kernel', 'Stream', 'KernelImpl', 'StreamImpl', 'KernelFactory', 'StreamFactory')"
/>
<!-- Do not generate the following functions -->
<xsl:variable
name=
"skip_methods"
select=
"('OpenMM_Context_getState', 'OpenMM_Platform_loadPluginsFromDirectory')"
/>
<!-- Suppress any function which references any of the following classes -->
<xsl:variable
name=
"hide_classes"
select=
"('Kernel', 'Stream', 'KernelImpl', 'StreamImpl', 'KernelFactory', 'StreamFactory')"
/>
<!-- Main loop over all classes in the OpenMM namespace -->
<xsl:template
match=
"/GCC_XML"
>
#ifndef OPENMM_CWRAPPER_H_
#define OPENMM_CWRAPPER_H_
/* Global Constants */
<xsl:for-each
select=
"Variable[@context=$openmm_namespace_id]"
>
static
<xsl:call-template
name=
"wrap_type"
><xsl:with-param
name=
"type_id"
select=
"@type"
/></xsl:call-template><xsl:value-of
select=
"concat(' OpenMM_', @name, ' = ', number(@init), ';')"
/>
</xsl:for-each>
/* Type Declarations */
<xsl:for-each
select=
"(Class | Struct)[@context=$openmm_namespace_id and empty(index-of($skip_classes, @name))]"
>
typedef struct OpenMM_
<xsl:value-of
select=
"concat(@name, '_struct OpenMM_', @name, ';')"
/>
</xsl:for-each>
typedef struct OpenMM_Vec3Array_struct OpenMM_Vec3Array;
typedef struct OpenMM_StringArray_struct OpenMM_StringArray;
typedef struct OpenMM_BondArray_struct OpenMM_BondArray;
typedef struct OpenMM_ParameterArray_struct OpenMM_ParameterArray;
typedef struct {double x, y, z;} OpenMM_Vec3;
typedef enum {OpenMM_False = 0, OpenMM_True = 1} OpenMM_Boolean;
#if defined(__cplusplus)
extern "C" {
#endif
/* OpenMM_Vec3 */
extern OpenMM_Vec3 OpenMM_Vec3_scale(const OpenMM_Vec3 vec, double scale);
/* OpenMM_Vec3Array */
extern OpenMM_Vec3Array* OpenMM_Vec3Array_create(int size);
extern void OpenMM_Vec3Array_destroy(OpenMM_Vec3Array* array);
extern int OpenMM_Vec3Array_getSize(const OpenMM_Vec3Array* array);
extern void OpenMM_Vec3Array_resize(OpenMM_Vec3Array* array, int size);
extern void OpenMM_Vec3Array_append(OpenMM_Vec3Array* array, const OpenMM_Vec3 vec);
extern void OpenMM_Vec3Array_set(OpenMM_Vec3Array* array, int index, const OpenMM_Vec3 vec);
extern const OpenMM_Vec3* OpenMM_Vec3Array_get(const OpenMM_Vec3Array* array, int index);
/* OpenMM_StringArray */
extern OpenMM_StringArray* OpenMM_StringArray_create(int size);
extern void OpenMM_StringArray_destroy(OpenMM_StringArray* array);
extern int OpenMM_StringArray_getSize(const OpenMM_StringArray* array);
extern void OpenMM_StringArray_resize(OpenMM_StringArray* array, int size);
extern void OpenMM_StringArray_append(OpenMM_StringArray* array, const char* string);
extern void OpenMM_StringArray_set(OpenMM_StringArray* array, int index, const char* string);
extern const char* OpenMM_StringArray_get(const OpenMM_StringArray* array, int index);
/* OpenMM_BondArray */
extern OpenMM_BondArray* OpenMM_BondArray_create(int size);
extern void OpenMM_BondArray_destroy(OpenMM_BondArray* array);
extern int OpenMM_BondArray_getSize(const OpenMM_BondArray* array);
extern void OpenMM_BondArray_resize(OpenMM_BondArray* array, int size);
extern void OpenMM_BondArray_append(OpenMM_BondArray* array, int particle1, int particle2);
extern void OpenMM_BondArray_set(OpenMM_BondArray* array, int index, int particle1, int particle2);
extern void OpenMM_BondArray_get(const OpenMM_BondArray* array, int index, int* particle1, int* particle2);
/* OpenMM_ParameterArray */
extern int OpenMM_ParameterArray_getSize(const OpenMM_ParameterArray* array);
extern double OpenMM_ParameterArray_get(const OpenMM_ParameterArray* array, const char* name);
/* These methods need to be handled specially, since their C++ APIs cannot be directly translated to C.
Unlike the C++ versions, the return value is allocated on the heap, and you must delete it yourself. */
extern OpenMM_State* OpenMM_Context_getState(const OpenMM_Context* target, int types);
extern OpenMM_StringArray* OpenMM_Platform_loadPluginsFromDirectory(const char* directory);
<!-- Class members -->
<xsl:for-each
select=
"Class[@context=$openmm_namespace_id and empty(index-of($skip_classes, @name))]"
>
<xsl:call-template
name=
"class"
/>
</xsl:for-each>
#if defined(__cplusplus)
}
#endif
#endif /*OPENMM_CWRAPPER_H_*/
</xsl:template>
<!-- Print out information for a class -->
<xsl:template
name=
"class"
>
<xsl:variable
name=
"class_name"
select=
"@name"
/>
<xsl:variable
name=
"class_id"
select=
"@id"
/>
/* OpenMM::
<xsl:value-of
select=
"concat(@name, '*/')"
/>
<!-- Enumerations -->
<xsl:for-each
select=
"/GCC_XML/Enumeration[@context=$class_id and @access='public']"
>
<xsl:call-template
name=
"enumeration"
>
<xsl:with-param
name=
"class_name"
select=
"$class_name"
/>
</xsl:call-template>
</xsl:for-each>
<!-- Constructors and destructor -->
<xsl:if
test=
"not(@abstract=1)"
>
<xsl:variable
name=
"constructors"
select=
"/GCC_XML/Constructor[@context=$class_id and @access='public' and not(@artificial='1')]"
/>
<xsl:for-each
select=
"$constructors"
>
<xsl:call-template
name=
"constructor"
>
<xsl:with-param
name=
"suffix"
select=
"if (position() > 1) then concat('_', position()) else ''"
/>
</xsl:call-template>
</xsl:for-each>
</xsl:if>
extern void OpenMM_
<xsl:value-of
select=
"concat(@name, '_destroy(OpenMM_', @name, '* target);')"
/>
<!-- Methods -->
<xsl:variable
name=
"methods"
select=
"/GCC_XML/Method[@context=$class_id and @access='public']"
/>
<xsl:for-each
select=
"$methods"
>
<xsl:variable
name=
"node"
select=
"."
/>
<!-- The next line is to deal with overloaded methods that have a const and a non-const version. -->
<xsl:if
test=
"not(@const=1) or empty($methods[@name=$node/@name and not(@const=1)])"
>
<xsl:variable
name=
"hide"
>
<xsl:call-template
name=
"should_hide"
/>
</xsl:variable>
<xsl:if
test=
"string-length($hide)=0"
>
<xsl:call-template
name=
"method"
>
<xsl:with-param
name=
"class_name"
select=
"$class_name"
/>
</xsl:call-template>
</xsl:if>
</xsl:if>
</xsl:for-each>
</xsl:template>
<!-- Print out the declaration for an enumeration -->
<xsl:template
name=
"enumeration"
>
<xsl:param
name=
"class_name"
/>
typedef enum {
<xsl:for-each
select=
"EnumValue"
>
<xsl:value-of
select=
"concat('OpenMM_', $class_name, '_', @name, ' = ', @init)"
/>
<xsl:if
test=
"position() < last()"
>
,
</xsl:if>
</xsl:for-each>
} OpenMM_
<xsl:value-of
select=
"concat($class_name, '_', @name, ';')"
/>
</xsl:template>
<!-- Print out the declaration for a constructor -->
<xsl:template
name=
"constructor"
>
<xsl:param
name=
"suffix"
/>
extern OpenMM_
<xsl:value-of
select=
"concat(@name, '* OpenMM_', @name, '_create', $suffix, '(')"
/>
<xsl:for-each
select=
"Argument"
>
<xsl:if
test=
"position() > 1"
>
,
</xsl:if>
<xsl:call-template
name=
"wrap_type"
><xsl:with-param
name=
"type_id"
select=
"@type"
/></xsl:call-template>
<xsl:value-of
select=
"concat(' ', @name)"
/>
</xsl:for-each>
<xsl:value-of
select=
"');'"
/>
</xsl:template>
<!-- Print out the declaration for a method -->
<xsl:template
name=
"method"
>
<xsl:param
name=
"class_name"
/>
extern
<xsl:call-template
name=
"wrap_type"
><xsl:with-param
name=
"type_id"
select=
"@returns"
/></xsl:call-template><xsl:value-of
select=
"concat(' OpenMM_', $class_name, '_', @name, '(')"
/>
<xsl:if
test=
"not(@static='1')"
>
<xsl:if
test=
"@const='1'"
>
<xsl:value-of
select=
"'const '"
/>
</xsl:if>
<xsl:value-of
select=
"concat('OpenMM_', $class_name, '* target')"
/>
</xsl:if>
<xsl:variable
name=
"static"
select=
"@static"
/>
<xsl:for-each
select=
"Argument"
>
<xsl:if
test=
"position() > 1 or not($static='1')"
>
,
</xsl:if>
<xsl:call-template
name=
"wrap_type"
><xsl:with-param
name=
"type_id"
select=
"@type"
/></xsl:call-template>
<xsl:value-of
select=
"concat(' ', @name)"
/>
</xsl:for-each>
<xsl:value-of
select=
"');'"
/>
</xsl:template>
<!-- Print out the description of a type in the wrapper API -->
<xsl:template
name=
"wrap_type"
>
<xsl:param
name=
"type_id"
/>
<xsl:variable
name=
"node"
select=
"/GCC_XML/*[@id=$type_id]"
/>
<xsl:choose>
<xsl:when
test=
"$type_id=$bool_type_id"
>
<xsl:value-of
select=
"'OpenMM_Boolean'"
/>
</xsl:when>
<xsl:when
test=
"$type_id=$string_type_id"
>
<xsl:value-of
select=
"'char*'"
/>
</xsl:when>
<xsl:when
test=
"$type_id=$const_ref_string_type_id"
>
<xsl:value-of
select=
"'const char*'"
/>
</xsl:when>
<xsl:when
test=
"$type_id=$vector_string_type_id"
>
<xsl:value-of
select=
"'OpenMM_StringArray'"
/>
</xsl:when>
<xsl:when
test=
"$type_id=$vector_vec3_type_id"
>
<xsl:value-of
select=
"'OpenMM_Vec3Array'"
/>
</xsl:when>
<xsl:when
test=
"$type_id=$vector_bond_type_id"
>
<xsl:value-of
select=
"'OpenMM_BondArray'"
/>
</xsl:when>
<xsl:when
test=
"$type_id=$map_parameter_type_id"
>
<xsl:value-of
select=
"'OpenMM_ParameterArray'"
/>
</xsl:when>
<xsl:when
test=
"local-name($node)='ReferenceType' or local-name($node)='PointerType'"
>
<xsl:call-template
name=
"wrap_type"
>
<xsl:with-param
name=
"type_id"
select=
"$node/@type"
/>
</xsl:call-template>
<xsl:value-of
select=
"'*'"
/>
</xsl:when>
<xsl:when
test=
"local-name($node)='CvQualifiedType'"
>
<xsl:if
test=
"$node/@const=1"
>
<xsl:value-of
select=
"'const '"
/>
</xsl:if>
<xsl:call-template
name=
"wrap_type"
>
<xsl:with-param
name=
"type_id"
select=
"$node/@type"
/>
</xsl:call-template>
</xsl:when>
<xsl:when
test=
"local-name($node)='Enumeration'"
>
<xsl:variable
name=
"class_name"
select=
"/GCC_XML/Class[@id=$node/@context]/@name"
/>
<xsl:value-of
select=
"concat('OpenMM_', $class_name, '_', $node/@name)"
/>
</xsl:when>
<xsl:when
test=
"$node/@context=$openmm_namespace_id"
>
<xsl:value-of
select=
"concat('OpenMM_', $node/@name)"
/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of
select=
"$node/@name"
/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Determine whether a method should be hidden -->
<xsl:template
name=
"should_hide"
>
<xsl:variable
name=
"class_id"
select=
"@context"
/>
<xsl:variable
name=
"method_name"
select=
"concat('OpenMM_', /GCC_XML/Class[@id=$class_id]/@name, '_', @name)"
/>
<xsl:if
test=
"not(empty(index-of($skip_methods, $method_name)))"
>
1
</xsl:if>
<xsl:call-template
name=
"hide_type"
>
<xsl:with-param
name=
"type_id"
select=
"@returns"
/>
</xsl:call-template>
<xsl:for-each
select=
"Argument"
>
<xsl:call-template
name=
"hide_type"
>
<xsl:with-param
name=
"type_id"
select=
"@type"
/>
</xsl:call-template>
</xsl:for-each>
</xsl:template>
<!-- This is called by should_hide. It generates output if the specified type should be hidden. -->
<xsl:template
name=
"hide_type"
>
<xsl:param
name=
"type_id"
/>
<xsl:variable
name=
"node"
select=
"/GCC_XML/*[@id=$type_id]"
/>
<xsl:choose>
<xsl:when
test=
"local-name($node)='ReferenceType' or local-name($node)='PointerType' or local-name($node)='CvQualifiedType'"
>
<xsl:call-template
name=
"hide_type"
>
<xsl:with-param
name=
"type_id"
select=
"$node/@type"
/>
</xsl:call-template>
</xsl:when>
<xsl:when
test=
"local-name($node)='Enumeration'"
>
<xsl:call-template
name=
"hide_type"
>
<xsl:with-param
name=
"type_id"
select=
"$node/@context"
/>
</xsl:call-template>
</xsl:when>
<xsl:when
test=
"$node/@context=$openmm_namespace_id and not(empty(index-of($hide_classes, $node/@name)))"
>
<xsl:value-of
select=
"1"
/>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
\ No newline at end of file
wrappers/CWrapper_Source.xslt
0 → 100644
View file @
ce24d1bd
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet
version=
"2.0"
xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"
>
<xsl:output
method=
"text"
omit-xml-declaration=
"yes"
/>
<xsl:variable
name=
"std_namespace_id"
select=
"/GCC_XML/Namespace[@name='std']/@id"
/>
<xsl:variable
name=
"openmm_namespace_id"
select=
"/GCC_XML/Namespace[@name='OpenMM']/@id"
/>
<xsl:variable
name=
"void_type_id"
select=
"/GCC_XML/FundamentalType[@name='void']/@id"
/>
<xsl:variable
name=
"bool_type_id"
select=
"/GCC_XML/FundamentalType[@name='bool']/@id"
/>
<xsl:variable
name=
"string_type_id"
select=
"/GCC_XML/*[@name='string' and @context=$std_namespace_id]/@id"
/>
<xsl:variable
name=
"const_string_type_id"
select=
"/GCC_XML/CvQualifiedType[@type=$string_type_id]/@id"
/>
<xsl:variable
name=
"const_ref_string_type_id"
select=
"/GCC_XML/ReferenceType[@type=$const_string_type_id]/@id"
/>
<xsl:variable
name=
"vec3_type_id"
select=
"/GCC_XML/Class[@name='Vec3' and @context=$openmm_namespace_id]/@id"
/>
<xsl:variable
name=
"vector_string_type_id"
select=
"/GCC_XML/Class[starts-with(@name, 'vector<std::basic_string')]/@id"
/>
<xsl:variable
name=
"vector_vec3_type_id"
select=
"/GCC_XML/Class[starts-with(@name, 'vector<OpenMM::Vec3')]/@id"
/>
<xsl:variable
name=
"vector_bond_type_id"
select=
"/GCC_XML/Class[starts-with(@name, 'vector<std::pair<int, int')]/@id"
/>
<xsl:variable
name=
"map_parameter_type_id"
select=
"/GCC_XML/Class[starts-with(@name, 'map<std::basic_string')]/@id"
/>
<xsl:variable
name=
"newline"
>
<xsl:text>
</xsl:text>
</xsl:variable>
<!-- Do not generate functions for the following classes -->
<xsl:variable
name=
"skip_classes"
select=
"('Vec3', 'Kernel', 'Stream', 'KernelImpl', 'StreamImpl', 'KernelFactory', 'StreamFactory')"
/>
<!-- Do not generate the following functions -->
<xsl:variable
name=
"skip_methods"
select=
"('OpenMM_Context_getState', 'OpenMM_Platform_loadPluginsFromDirectory')"
/>
<!-- Suppress any function which references any of the following classes -->
<xsl:variable
name=
"hide_classes"
select=
"('Kernel', 'Stream', 'KernelImpl', 'StreamImpl', 'KernelFactory', 'StreamFactory')"
/>
<!-- Main loop over all classes in the OpenMM namespace -->
<xsl:template
match=
"/GCC_XML"
>
#include "OpenMMCWrapper.h"
#include "OpenMM.h"
#include
<
cstring
>
#include
<
vector
>
using namespace OpenMM;
using namespace std;
#if defined(__cplusplus)
extern "C" {
#endif
/* OpenMM_Vec3 */
OpenMM_Vec3 OpenMM_Vec3_scale(const OpenMM_Vec3 vec, double scale) {
OpenMM_Vec3 result = {vec.x*scale, vec.y*scale, vec.z*scale};
return result;
}
/* OpenMM_Vec3Array */
OpenMM_Vec3Array* OpenMM_Vec3Array_create(int size) {
return reinterpret_cast
<
OpenMM_Vec3Array*
>
(new vector
<
Vec3
>
(size));
}
void OpenMM_Vec3Array_destroy(OpenMM_Vec3Array* array) {
delete reinterpret_cast
<
vector
<
Vec3
>
*
>
(array);
}
int OpenMM_Vec3Array_getSize(const OpenMM_Vec3Array* array) {
return reinterpret_cast
<
const vector
<
Vec3
>
*
>
(array)->size();
}
void OpenMM_Vec3Array_resize(OpenMM_Vec3Array* array, int size) {
reinterpret_cast
<
vector
<
Vec3
>
*
>
(array)->resize(size);
}
void OpenMM_Vec3Array_append(OpenMM_Vec3Array* array, const OpenMM_Vec3 vec) {
reinterpret_cast
<
vector
<
Vec3
>
*
>
(array)->push_back(Vec3(vec.x, vec.y, vec.z));
}
void OpenMM_Vec3Array_set(OpenMM_Vec3Array* array, int index, const OpenMM_Vec3 vec) {
(*reinterpret_cast
<
vector
<
Vec3
>
*
>
(array))[index] = Vec3(vec.x, vec.y, vec.z);
}
const OpenMM_Vec3* OpenMM_Vec3Array_get(const OpenMM_Vec3Array* array, int index) {
return reinterpret_cast
<
const OpenMM_Vec3*
>
((
&
(*reinterpret_cast
<
const vector
<
Vec3
>
*
>
(array))[index]));
}
/* OpenMM_StringArray */
OpenMM_StringArray* OpenMM_StringArray_create(int size) {
return reinterpret_cast
<
OpenMM_StringArray*
>
(new vector
<
string
>
(size));
}
void OpenMM_StringArray_destroy(OpenMM_StringArray* array) {
delete reinterpret_cast
<
vector
<
string
>
*
>
(array);
}
int OpenMM_StringArray_getSize(const OpenMM_StringArray* array) {
return reinterpret_cast
<
const vector
<
string
>
*
>
(array)->size();
}
void OpenMM_StringArray_resize(OpenMM_StringArray* array, int size) {
reinterpret_cast
<
vector
<
string
>
*
>
(array)->resize(size);
}
void OpenMM_StringArray_append(OpenMM_StringArray* array, const char* str) {
reinterpret_cast
<
vector
<
string
>
*
>
(array)->push_back(string(str));
}
void OpenMM_StringArray_set(OpenMM_StringArray* array, int index, const char* str) {
(*reinterpret_cast
<
vector
<
string
>
*
>
(array))[index] = string(str);
}
const char* OpenMM_StringArray_get(const OpenMM_StringArray* array, int index) {
return (*reinterpret_cast
<
const vector
<
string
>
*
>
(array))[index].c_str();
}
/* OpenMM_BondArray */
OpenMM_BondArray* OpenMM_BondArray_create(int size) {
return reinterpret_cast
<
OpenMM_BondArray*
>
(new vector
<
pair
<
int, int
>
>
(size));
}
void OpenMM_BondArray_destroy(OpenMM_BondArray* array) {
delete reinterpret_cast
<
vector
<
pair
<
int, int
>
>
*
>
(array);
}
int OpenMM_BondArray_getSize(const OpenMM_BondArray* array) {
return reinterpret_cast
<
const vector
<
pair
<
int, int
>
>
*
>
(array)->size();
}
void OpenMM_BondArray_resize(OpenMM_BondArray* array, int size) {
reinterpret_cast
<
vector
<
pair
<
int, int
>
>
*
>
(array)->resize(size);
}
void OpenMM_BondArray_append(OpenMM_BondArray* array, int particle1, int particle2) {
reinterpret_cast
<
vector
<
pair
<
int, int
>
>
*
>
(array)->push_back(pair
<
int, int
>
(particle1, particle2));
}
void OpenMM_BondArray_set(OpenMM_BondArray* array, int index, int particle1, int particle2) {
(*reinterpret_cast
<
vector
<
pair
<
int, int
>
>
*
>
(array))[index] = pair
<
int, int
>
(particle1, particle2);
}
void OpenMM_BondArray_get(const OpenMM_BondArray* array, int index, int* particle1, int* particle2) {
pair
<
int, int
>
particles = (*reinterpret_cast
<
const vector
<
pair
<
int, int
>
>
*
>
(array))[index];
*particle1 = particles.first;
*particle2 = particles.second;
}
/* OpenMM_ParameterArray */
int OpenMM_ParameterArray_getSize(const OpenMM_ParameterArray* array) {
return reinterpret_cast
<
const map
<
string, double
>
*
>
(array)->size();
}
double OpenMM_ParameterArray_get(const OpenMM_ParameterArray* array, const char* name) {
const map
<
string, double
>
* params = reinterpret_cast
<
const map
<
string, double
>
*
>
(array);
const map
<
string, double
>
::const_iterator iter = params->find(string(name));
if (iter == params->end())
throw OpenMMException("OpenMM_ParameterArray_get: No such parameter");
return iter->second;
}
/* These methods need to be handled specially, since their C++ APIs cannot be directly translated to C.
Unlike the C++ versions, the return value is allocated on the heap, and you must delete it yourself. */
OpenMM_State* OpenMM_Context_getState(const OpenMM_Context* target, int types) {
State result = reinterpret_cast
<
const Context*
>
(target)->getState(types);
return reinterpret_cast
<
OpenMM_State*
>
(new State(result));
};
OpenMM_StringArray* OpenMM_Platform_loadPluginsFromDirectory(const char* directory) {
vector
<
string
>
result = Platform::loadPluginsFromDirectory(string(directory));
return reinterpret_cast
<
OpenMM_StringArray*
>
(new vector
<
string
>
(result));
};
<!-- Class members -->
<xsl:for-each
select=
"Class[@context=$openmm_namespace_id and empty(index-of($skip_classes, @name))]"
>
<xsl:call-template
name=
"class"
/>
</xsl:for-each>
#if defined(__cplusplus)
}
#endif
</xsl:template>
<!-- Print out information for a class -->
<xsl:template
name=
"class"
>
<xsl:variable
name=
"class_name"
select=
"@name"
/>
<xsl:variable
name=
"class_id"
select=
"@id"
/>
/* OpenMM::
<xsl:value-of
select=
"concat(@name, '*/')"
/>
<!-- Constructors and destructor -->
<xsl:if
test=
"not(@abstract=1)"
>
<xsl:variable
name=
"constructors"
select=
"/GCC_XML/Constructor[@context=$class_id and @access='public' and not(@artificial='1')]"
/>
<xsl:for-each
select=
"$constructors"
>
<xsl:call-template
name=
"constructor"
>
<xsl:with-param
name=
"suffix"
select=
"if (position() > 1) then concat('_', position()) else ''"
/>
</xsl:call-template>
</xsl:for-each>
</xsl:if>
void OpenMM_
<xsl:value-of
select=
"concat(@name, '_destroy(OpenMM_', @name, '* target) {')"
/>
delete reinterpret_cast
<
<xsl:value-of
select=
"@name"
/>
*
>
(target);
}
<!-- Methods -->
<xsl:variable
name=
"methods"
select=
"/GCC_XML/Method[@context=$class_id and @access='public']"
/>
<xsl:for-each
select=
"$methods"
>
<xsl:variable
name=
"node"
select=
"."
/>
<!-- The next line is to deal with overloaded methods that have a const and a non-const version. -->
<xsl:if
test=
"not(@const=1) or empty($methods[@name=$node/@name and not(@const=1)])"
>
<xsl:variable
name=
"hide"
>
<xsl:call-template
name=
"should_hide"
/>
</xsl:variable>
<xsl:if
test=
"string-length($hide)=0"
>
<xsl:call-template
name=
"method"
>
<xsl:with-param
name=
"class_name"
select=
"$class_name"
/>
<xsl:with-param
name=
"class_id"
select=
"$class_id"
/>
</xsl:call-template>
</xsl:if>
</xsl:if>
</xsl:for-each>
</xsl:template>
<!-- Print out the definition of a constructor -->
<xsl:template
name=
"constructor"
>
<xsl:param
name=
"suffix"
/>
OpenMM_
<xsl:value-of
select=
"concat(@name, '* OpenMM_', @name, '_create', $suffix, '(')"
/>
<xsl:for-each
select=
"Argument"
>
<xsl:if
test=
"position() > 1"
>
,
</xsl:if>
<xsl:call-template
name=
"wrap_type"
><xsl:with-param
name=
"type_id"
select=
"@type"
/></xsl:call-template>
<xsl:value-of
select=
"concat(' ', @name)"
/>
</xsl:for-each>
<xsl:value-of
select=
"') {'"
/>
return reinterpret_cast
<
OpenMM_
<xsl:value-of
select=
"@name"
/>
*
>
(new
<xsl:value-of
select=
"concat(@name, '(')"
/>
<xsl:for-each
select=
"Argument"
>
<xsl:if
test=
"position() > 1"
>
,
</xsl:if>
<xsl:call-template
name=
"unwrap_value"
>
<xsl:with-param
name=
"value"
select=
"@name"
/>
<xsl:with-param
name=
"type_id"
select=
"@type"
/>
</xsl:call-template>
</xsl:for-each>
<xsl:value-of
select=
"'));'"
/>
}
</xsl:template>
<!-- Print out the definition of a method -->
<xsl:template
name=
"method"
>
<xsl:param
name=
"class_name"
/>
<xsl:param
name=
"class_id"
/>
<!-- First the method signature -->
<xsl:value-of
select=
"$newline"
/>
<xsl:call-template
name=
"wrap_type"
><xsl:with-param
name=
"type_id"
select=
"@returns"
/></xsl:call-template><xsl:value-of
select=
"concat(' OpenMM_', $class_name, '_', @name, '(')"
/>
<xsl:if
test=
"not(@static='1')"
>
<xsl:if
test=
"@const='1'"
>
<xsl:value-of
select=
"'const '"
/>
</xsl:if>
<xsl:value-of
select=
"concat('OpenMM_', $class_name, '* target')"
/>
</xsl:if>
<!-- Generate the list of arguments -->
<xsl:variable
name=
"method"
select=
"."
/>
<xsl:for-each
select=
"Argument"
>
<xsl:if
test=
"position() > 1 or not($method/@static='1')"
>
,
</xsl:if>
<xsl:call-template
name=
"wrap_type"
><xsl:with-param
name=
"type_id"
select=
"@type"
/></xsl:call-template>
<xsl:value-of
select=
"concat(' ', @name)"
/>
</xsl:for-each>
<xsl:value-of
select=
"concat(') {', $newline, ' ')"
/>
<!-- Now the method body -->
<xsl:if
test=
"not(@returns=$void_type_id)"
>
<xsl:call-template
name=
"unwrap_type"
><xsl:with-param
name=
"type_id"
select=
"@returns"
/></xsl:call-template>
<xsl:value-of
select=
"' result = '"
/>
</xsl:if>
<xsl:variable
name=
"return_type"
select=
"/GCC_XML/*[@id=$method/@returns]"
/>
<xsl:if
test=
"local-name($return_type)='ReferenceType'"
>
<xsl:value-of
select=
"'&'"
/>
</xsl:if>
<xsl:choose>
<xsl:when
test=
"@static='1'"
>
<!-- Invoke the method on the class -->
<xsl:value-of
select=
"concat($class_name, '::')"
/>
</xsl:when>
<xsl:otherwise>
<!-- Invoke the method on the target object -->
<xsl:value-of
select=
"'reinterpret_cast<'"
/>
<xsl:if
test=
"@const='1'"
>
<xsl:value-of
select=
"'const '"
/>
</xsl:if>
<xsl:value-of
select=
"concat($class_name, '*>(target)->')"
/>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of
select=
"concat(@name, '(')"
/>
<xsl:for-each
select=
"Argument"
>
<xsl:if
test=
"position() > 1"
>
,
</xsl:if>
<xsl:call-template
name=
"unwrap_value"
>
<xsl:with-param
name=
"value"
select=
"@name"
/>
<xsl:with-param
name=
"type_id"
select=
"@type"
/>
</xsl:call-template>
</xsl:for-each>
<xsl:value-of
select=
"');'"
/>
<xsl:if
test=
"not(@returns=$void_type_id)"
>
<xsl:value-of
select=
"concat($newline, ' return ')"
/>
<xsl:call-template
name=
"wrap_value"
><xsl:with-param
name=
"value"
select=
"'result'"
/><xsl:with-param
name=
"type_id"
select=
"@returns"
/></xsl:call-template>
<xsl:value-of
select=
"';'"
/>
</xsl:if>
};
</xsl:template>
<!-- Print out the description of a type in the wrapper API -->
<xsl:template
name=
"wrap_type"
>
<xsl:param
name=
"type_id"
/>
<xsl:variable
name=
"node"
select=
"/GCC_XML/*[@id=$type_id]"
/>
<xsl:choose>
<xsl:when
test=
"$type_id=$bool_type_id"
>
<xsl:value-of
select=
"'OpenMM_Boolean'"
/>
</xsl:when>
<xsl:when
test=
"$type_id=$string_type_id"
>
<xsl:value-of
select=
"'char*'"
/>
</xsl:when>
<xsl:when
test=
"$type_id=$const_ref_string_type_id"
>
<xsl:value-of
select=
"'const char*'"
/>
</xsl:when>
<xsl:when
test=
"$type_id=$vector_string_type_id"
>
<xsl:value-of
select=
"'OpenMM_StringArray'"
/>
</xsl:when>
<xsl:when
test=
"$type_id=$vector_vec3_type_id"
>
<xsl:value-of
select=
"'OpenMM_Vec3Array'"
/>
</xsl:when>
<xsl:when
test=
"$type_id=$vector_bond_type_id"
>
<xsl:value-of
select=
"'OpenMM_BondArray'"
/>
</xsl:when>
<xsl:when
test=
"$type_id=$map_parameter_type_id"
>
<xsl:value-of
select=
"'OpenMM_ParameterArray'"
/>
</xsl:when>
<xsl:when
test=
"local-name($node)='ReferenceType' or local-name($node)='PointerType'"
>
<xsl:call-template
name=
"wrap_type"
>
<xsl:with-param
name=
"type_id"
select=
"$node/@type"
/>
</xsl:call-template>
<xsl:value-of
select=
"'*'"
/>
</xsl:when>
<xsl:when
test=
"local-name($node)='CvQualifiedType'"
>
<xsl:if
test=
"$node/@const=1"
>
<xsl:value-of
select=
"'const '"
/>
</xsl:if>
<xsl:call-template
name=
"wrap_type"
>
<xsl:with-param
name=
"type_id"
select=
"$node/@type"
/>
</xsl:call-template>
</xsl:when>
<xsl:when
test=
"local-name($node)='Enumeration'"
>
<xsl:variable
name=
"class_name"
select=
"/GCC_XML/Class[@id=$node/@context]/@name"
/>
<xsl:value-of
select=
"concat('OpenMM_', $class_name, '_', $node/@name)"
/>
</xsl:when>
<xsl:when
test=
"$node/@context=$openmm_namespace_id"
>
<xsl:value-of
select=
"concat('OpenMM_', $node/@name)"
/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of
select=
"$node/@name"
/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Print out the description of a type in the native API -->
<xsl:template
name=
"unwrap_type"
>
<xsl:param
name=
"type_id"
/>
<xsl:variable
name=
"node"
select=
"/GCC_XML/*[@id=$type_id]"
/>
<xsl:choose>
<xsl:when
test=
"$type_id=$vector_string_type_id"
>
<xsl:value-of
select=
"'vector<string>'"
/>
</xsl:when>
<xsl:when
test=
"$type_id=$vector_vec3_type_id"
>
<xsl:value-of
select=
"'vector<Vec3>'"
/>
</xsl:when>
<xsl:when
test=
"$type_id=$vector_bond_type_id"
>
<xsl:value-of
select=
"'vector<pair<int, int> >'"
/>
</xsl:when>
<xsl:when
test=
"$type_id=$map_parameter_type_id"
>
<xsl:value-of
select=
"'map<string, double>'"
/>
</xsl:when>
<xsl:when
test=
"local-name($node)='ReferenceType' or local-name($node)='PointerType'"
>
<xsl:call-template
name=
"unwrap_type"
>
<xsl:with-param
name=
"type_id"
select=
"$node/@type"
/>
</xsl:call-template>
<xsl:value-of
select=
"'*'"
/>
</xsl:when>
<xsl:when
test=
"local-name($node)='CvQualifiedType'"
>
<xsl:if
test=
"$node/@const=1"
>
<xsl:value-of
select=
"'const '"
/>
</xsl:if>
<xsl:call-template
name=
"unwrap_type"
>
<xsl:with-param
name=
"type_id"
select=
"$node/@type"
/>
</xsl:call-template>
</xsl:when>
<xsl:when
test=
"local-name($node)='Enumeration'"
>
<xsl:variable
name=
"class_name"
select=
"/GCC_XML/Class[@id=$node/@context]/@name"
/>
<xsl:value-of
select=
"concat($class_name, '::', $node/@name)"
/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of
select=
"$node/@name"
/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Print out a value, if necessary casting from a native type to a wrapped type -->
<xsl:template
name=
"wrap_value"
>
<xsl:param
name=
"value"
/>
<xsl:param
name=
"type_id"
/>
<xsl:variable
name=
"node"
select=
"/GCC_XML/*[@id=$type_id]"
/>
<xsl:choose>
<xsl:when
test=
"$type_id=$bool_type_id"
>
<xsl:value-of
select=
"concat('(', $value, ' ? OpenMM_True : OpenMM_False)')"
/>
</xsl:when>
<xsl:when
test=
"$type_id=$string_type_id"
>
<xsl:value-of
select=
"concat($value, '.c_str()')"
/>
</xsl:when>
<xsl:when
test=
"$type_id=$const_ref_string_type_id"
>
<xsl:value-of
select=
"concat($value, '->c_str()')"
/>
</xsl:when>
<xsl:when
test=
"local-name($node)='FundamentalType'"
>
<xsl:value-of
select=
"$value"
/>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when
test=
"local-name($node)='Enumeration'"
>
<xsl:value-of
select=
"'static_cast<'"
/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of
select=
"'reinterpret_cast<'"
/>
</xsl:otherwise>
</xsl:choose>
<xsl:call-template
name=
"wrap_type"
>
<xsl:with-param
name=
"type_id"
select=
"$type_id"
/>
</xsl:call-template>
<xsl:value-of
select=
"concat('>(', $value, ')')"
/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Print out a value, if necessary casting from a wrapped type to a native type -->
<xsl:template
name=
"unwrap_value"
>
<xsl:param
name=
"value"
/>
<xsl:param
name=
"type_id"
/>
<xsl:variable
name=
"node"
select=
"/GCC_XML/*[@id=$type_id]"
/>
<xsl:choose>
<xsl:when
test=
"$type_id=$bool_type_id"
>
<xsl:value-of
select=
"concat('(', $value, ' != OpenMM_False)')"
/>
</xsl:when>
<xsl:when
test=
"$type_id=$string_type_id"
>
<xsl:value-of
select=
"concat('string(', $value, ')')"
/>
</xsl:when>
<xsl:when
test=
"$type_id=$const_ref_string_type_id"
>
<xsl:value-of
select=
"concat('string(', $value, ')')"
/>
</xsl:when>
<xsl:when
test=
"local-name($node)='FundamentalType'"
>
<xsl:value-of
select=
"$value"
/>
</xsl:when>
<xsl:when
test=
"$type_id=$vec3_type_id"
>
<xsl:value-of
select=
"concat('Vec3(', $value, '.x, ', $value, '.y, ', $value, '.z)')"
/>
</xsl:when>
<xsl:otherwise>
<xsl:if
test=
"local-name($node)='ReferenceType'"
><xsl:value-of
select=
"'*'"
/></xsl:if>
<xsl:choose>
<xsl:when
test=
"local-name($node)='Enumeration'"
>
<xsl:value-of
select=
"'static_cast<'"
/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of
select=
"'reinterpret_cast<'"
/>
</xsl:otherwise>
</xsl:choose>
<xsl:call-template
name=
"unwrap_type"
>
<xsl:with-param
name=
"type_id"
select=
"$type_id"
/>
</xsl:call-template>
<xsl:value-of
select=
"concat(' >(', $value, ')')"
/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Determine whether a method should be hidden -->
<xsl:template
name=
"should_hide"
>
<xsl:variable
name=
"class_id"
select=
"@context"
/>
<xsl:variable
name=
"method_name"
select=
"concat('OpenMM_', /GCC_XML/Class[@id=$class_id]/@name, '_', @name)"
/>
<xsl:if
test=
"not(empty(index-of($skip_methods, $method_name)))"
>
1
</xsl:if>
<xsl:call-template
name=
"hide_type"
>
<xsl:with-param
name=
"type_id"
select=
"@returns"
/>
</xsl:call-template>
<xsl:for-each
select=
"Argument"
>
<xsl:call-template
name=
"hide_type"
>
<xsl:with-param
name=
"type_id"
select=
"@type"
/>
</xsl:call-template>
</xsl:for-each>
</xsl:template>
<!-- This is called by should_hide. It generates output if the specified type should be hidden. -->
<xsl:template
name=
"hide_type"
>
<xsl:param
name=
"type_id"
/>
<xsl:variable
name=
"node"
select=
"/GCC_XML/*[@id=$type_id]"
/>
<xsl:choose>
<xsl:when
test=
"local-name($node)='ReferenceType' or local-name($node)='PointerType' or local-name($node)='CvQualifiedType'"
>
<xsl:call-template
name=
"hide_type"
>
<xsl:with-param
name=
"type_id"
select=
"$node/@type"
/>
</xsl:call-template>
</xsl:when>
<xsl:when
test=
"local-name($node)='Enumeration'"
>
<xsl:call-template
name=
"hide_type"
>
<xsl:with-param
name=
"type_id"
select=
"$node/@context"
/>
</xsl:call-template>
</xsl:when>
<xsl:when
test=
"$node/@context=$openmm_namespace_id and not(empty(index-of($hide_classes, $node/@name)))"
>
<xsl:value-of
select=
"1"
/>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment