Merge remote-tracking branch 'origin/master' into windows
[scilab.git] / scilab / modules / external_objects / includes / ScilabObjects.hxx
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 #ifndef __SCILABOBJECTS_HXX__
17 #define __SCILABOBJECTS_HXX__
18
19 #include <string.h>
20
21 #include "ExternalObjects.h"
22 #include "ScilabAbstractEnvironment.hxx"
23 #include "ScilabEnvironments.hxx"
24 #include "OptionsHelper.hxx"
25 #include "dynlib_external_objects_scilab.h"
26
27 extern "C" {
28 #include "api_scilab.h"
29 #include "localization.h"
30 }
31
32 namespace org_modules_external_objects
33 {
34 class EXTERNAL_OBJECTS_SCILAB_IMPEXP ScilabObjects
35 {
36     static bool isInit;
37     static const char * _EOBJ[];
38     static const char * _ECLASS[];
39     static const char * _EVOID[];
40 public:
41     static const char * _INVOKE_;
42
43     static void initialization(ScilabAbstractEnvironment & env, void * pvApiCtx);
44
45     static int createNamedEnvironmentObject(int type, const char * name, int id, const int envId, void * pvApiCtx);
46
47     static void createEnvironmentObjectAtPos(int type, int pos, int id, const int envId, void * pvApiCtx);
48
49     static void copyInvocationMacroToStack(int pos, const int envId, bool isNew, void * pvApiCtx);
50
51     static void removeTemporaryVars(const int envId, int * tmpvar);
52
53     static void removeVar(int * addr, void * pvApiCtx);
54
55     static bool unwrap(int idObj, int pos, const int envId, void * pvApiCtx);
56
57     static int getMListType(int * mlist, void * pvApiCtx);
58
59     static bool isValidExternal(int * mlist, void * pvApiCtx);
60
61     static bool isExternalObj(int * mlist, void * pvApiCtx);
62
63     static bool isExternalClass(int * mlist, void * pvApiCtx);
64
65     static bool isExternalVoid(int * mlist, void * pvApiCtx);
66
67     static bool isExternalObjOrClass(int * mlist, void * pvApiCtx);
68
69     static char * getSingleString(int pos, void * pvApiCtx);
70
71     static int isPositiveIntegerAtAddress(int * addr, void * pvApiCtx);
72
73     static int getEnvironmentId(int * addr, void * pvApiCtx);
74
75     static int getExternalId(int * addr, void * pvApiCtx);
76
77     static int getArgumentId(int * addr, int * tmpvars, const bool isRef, const bool isClass, const int envId, void * pvApiCtx);
78
79     template <typename T>
80     inline static int wrap(const int row, const int col, T * data, const ScilabAbstractEnvironmentWrapper & wrapper, const bool isRef)
81     {
82         if (row == 0 || col == 0)
83         {
84             // Empty matrix is plugged on null object
85             return 0;
86         }
87         else if (row == 1 && col == 1)
88         {
89             return wrapper.wrap(data, isRef);
90         }
91         else if (row == 1)
92         {
93             return wrapper.wrap(data, col, isRef);
94         }
95
96         return wrapper.wrap(data, row, col, isRef);
97     }
98
99     inline static int wrapBool(const int row, const int col, int * data, const ScilabAbstractEnvironmentWrapper & wrapper, const bool isRef)
100     {
101         if (row == 0 || col == 0)
102         {
103             // Empty matrix is plugged on null object
104             return 0;
105         }
106         else if (row == 1 && col == 1)
107         {
108             return wrapper.wrapBool(data, isRef);
109         }
110         else if (row == 1)
111         {
112             return wrapper.wrapBool(data, col, isRef);
113         }
114
115         return wrapper.wrapBool(data, row, col, isRef);
116     }
117
118     inline static int wrapFloat(const int row, const int col, double * data, const ScilabAbstractEnvironmentWrapper & wrapper, const bool isRef)
119     {
120         if (row == 0 || col == 0)
121         {
122             // Empty matrix is plugged on null object
123             return 0;
124         }
125         else if (row == 1 && col == 1)
126         {
127             return wrapper.wrapFloat(data, isRef);
128         }
129         else if (row == 1)
130         {
131             return wrapper.wrapFloat(data, col, isRef);
132         }
133
134         return wrapper.wrapFloat(data, row, col, isRef);
135     }
136
137     inline static int wrap(const int row, const int col, double * real, double * imag, const ScilabAbstractEnvironmentWrapper & wrapper, const bool isRef)
138     {
139         if (row == 0 || col == 0)
140         {
141             // Empty matrix is plugged on null object
142             return 0;
143         }
144         else if (row == 1 && col == 1)
145         {
146             return wrapper.wrap(real, imag, isRef);
147         }
148         else if (row == 1)
149         {
150             return wrapper.wrap(real, imag, col, isRef);
151         }
152
153         return wrapper.wrap(real, imag, row, col, isRef);
154     }
155 };
156 }
157
158 #endif // __SCILABOBJECTS_HXX__