Skip to content

Commit 6e086cc

Browse files
committed
refactor c part
Signed-off-by: Etienne LESOT <[email protected]>
1 parent ff0a045 commit 6e086cc

File tree

8 files changed

+268
-85
lines changed

8 files changed

+268
-85
lines changed

cpp/powsybl-cpp/powsybl-api.h

+1
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,7 @@ typedef struct {
313313
typedef struct zone_struct {
314314
char* id;
315315
char** injections_ids;
316+
int injections_ids_count;
316317
double* injections_shift_keys;
317318
int length;
318319
} zone;

cpp/powsybl-cpp/powsybl-cpp.cpp

+84-60
Original file line numberDiff line numberDiff line change
@@ -172,37 +172,34 @@ std::map<std::string, std::string> convertMapStructToStdMap(string_map* map) {
172172
}
173173

174174
char* copyStringToCharPtr(const std::string& str) {
175-
char* c = new char[str.size() + 1];
175+
char* c = initializeCharPointer(str.size() + 1);
176176
str.copy(c, str.size());
177177
c[str.size()] = '\0';
178178
return c;
179179
}
180180

181181
char** copyVectorStringToCharPtrPtr(const std::vector<std::string>& strings) {
182-
char** charPtrPtr = new char*[strings.size()];
182+
char** charPtrPtr = initializeCharPointerPointer(strings.size());
183183
for (int i = 0; i < strings.size(); i++) {
184184
charPtrPtr[i] = copyStringToCharPtr(strings[i]);
185185
}
186186
return charPtrPtr;
187187
}
188188

189189
int* copyVectorInt(const std::vector<int>& ints) {
190-
int* intPtr = new int[ints.size()];
190+
int* intPtr = initializeIntPointer(ints.size());
191191
std::copy(ints.begin(), ints.end(), intPtr);
192192
return intPtr;
193193
}
194194

195195
double* copyVectorDouble(const std::vector<double>& doubles) {
196-
double* doublePtr = new double[doubles.size()];
196+
double* doublePtr = initializeDoublePointer(doubles.size());
197197
std::copy(doubles.begin(), doubles.end(), doublePtr);
198198
return doublePtr;
199199
}
200200

201201
void deleteCharPtrPtr(char** charPtrPtr, int length) {
202-
for (int i = 0; i < length; i++) {
203-
delete[] charPtrPtr[i];
204-
}
205-
delete[] charPtrPtr;
202+
freeCharPointerPointer(charPtrPtr);
206203
}
207204

208205
void freeCString(char* str) {
@@ -221,12 +218,6 @@ void copyCharPtrPtrToVector(char** src, int count, std::vector<std::string>& des
221218
std::copy(src, src + count, std::back_inserter(dest));
222219
}
223220

224-
void deleteLoadFlowParameters(loadflow_parameters* ptr) {
225-
pypowsybl::deleteCharPtrPtr(ptr->countries_to_balance, ptr->countries_to_balance_count);
226-
pypowsybl::deleteCharPtrPtr(ptr->provider_parameters_keys, ptr->provider_parameters_keys_count);
227-
pypowsybl::deleteCharPtrPtr(ptr->provider_parameters_values, ptr->provider_parameters_values_count);
228-
}
229-
230221
LoadFlowParameters::LoadFlowParameters(loadflow_parameters* src) {
231222
voltage_init_mode = static_cast<VoltageInitMode>(src->voltage_init_mode);
232223
transformer_voltage_control_on = (bool) src->transformer_voltage_control_on;
@@ -267,19 +258,14 @@ void LoadFlowParameters::load_to_c_struct(loadflow_parameters& res) const {
267258
}
268259

269260
std::shared_ptr<loadflow_parameters> LoadFlowParameters::to_c_struct() const {
270-
loadflow_parameters* res = new loadflow_parameters();
261+
loadflow_parameters* res = PowsyblCaller::get()->callJava<loadflow_parameters*>(::createLoadFlowParameters);
271262
load_to_c_struct(*res);
272263
//Memory has been allocated here on C side, we need to clean it up on C side (not java side)
273264
return std::shared_ptr<loadflow_parameters>(res, [](loadflow_parameters* ptr){
274-
deleteLoadFlowParameters(ptr);
275-
delete ptr;
265+
PowsyblCaller::get()->callJava(::freeLoadFlowParameters, ptr);
276266
});
277267
}
278268

279-
void deleteLoadFlowValidationParameters(loadflow_validation_parameters* ptr) {
280-
deleteLoadFlowParameters(&ptr->loadflow_parameters);
281-
}
282-
283269
LoadFlowValidationParameters::LoadFlowValidationParameters(loadflow_validation_parameters* src):
284270
loadflow_parameters(&src->loadflow_parameters)
285271
{
@@ -309,21 +295,14 @@ void LoadFlowValidationParameters::load_to_c_struct(loadflow_validation_paramete
309295
}
310296

311297
std::shared_ptr<loadflow_validation_parameters> LoadFlowValidationParameters::to_c_struct() const {
312-
loadflow_validation_parameters* res = new loadflow_validation_parameters();
298+
loadflow_validation_parameters* res = PowsyblCaller::get()->callJava<loadflow_validation_parameters*>(::createValidationConfig);
313299
load_to_c_struct(*res);
314300
//Memory has been allocated here on C side, we need to clean it up on C side (not java side)
315301
return std::shared_ptr<loadflow_validation_parameters>(res, [](loadflow_validation_parameters* ptr){
316-
deleteLoadFlowValidationParameters(ptr);
317-
delete ptr;
302+
PowsyblCaller::get()->callJava(::freeValidationConfig, ptr);
318303
});
319304
}
320305

321-
void deleteSecurityAnalysisParameters(security_analysis_parameters* ptr) {
322-
deleteLoadFlowParameters(&ptr->loadflow_parameters);
323-
pypowsybl::deleteCharPtrPtr(ptr->provider_parameters_keys, ptr->provider_parameters_keys_count);
324-
pypowsybl::deleteCharPtrPtr(ptr->provider_parameters_values, ptr->provider_parameters_values_count);
325-
}
326-
327306
SecurityAnalysisParameters::SecurityAnalysisParameters(security_analysis_parameters* src):
328307
loadflow_parameters(&src->loadflow_parameters)
329308
{
@@ -337,7 +316,7 @@ SecurityAnalysisParameters::SecurityAnalysisParameters(security_analysis_paramet
337316
}
338317

339318
std::shared_ptr<security_analysis_parameters> SecurityAnalysisParameters::to_c_struct() const {
340-
security_analysis_parameters* res = new security_analysis_parameters();
319+
security_analysis_parameters* res = PowsyblCaller::get()->callJava<security_analysis_parameters*>(::createSecurityAnalysisParameters);
341320
loadflow_parameters.load_to_c_struct(res->loadflow_parameters);
342321
res->flow_proportional_threshold = (double) flow_proportional_threshold;
343322
res->low_voltage_proportional_threshold = (double) low_voltage_proportional_threshold;
@@ -350,17 +329,10 @@ std::shared_ptr<security_analysis_parameters> SecurityAnalysisParameters::to_c_s
350329
res->provider_parameters_values_count = provider_parameters_values.size();
351330
//Memory has been allocated here on C side, we need to clean it up on C side (not java side)
352331
return std::shared_ptr<security_analysis_parameters>(res, [](security_analysis_parameters* ptr){
353-
deleteSecurityAnalysisParameters(ptr);
354-
delete ptr;
332+
PowsyblCaller::get()->callJava(::freeSecurityAnalysisParameters, ptr);
355333
});
356334
}
357335

358-
void deleteSensitivityAnalysisParameters(sensitivity_analysis_parameters* ptr) {
359-
deleteLoadFlowParameters(&ptr->loadflow_parameters);
360-
pypowsybl::deleteCharPtrPtr(ptr->provider_parameters_keys, ptr->provider_parameters_keys_count);
361-
pypowsybl::deleteCharPtrPtr(ptr->provider_parameters_values, ptr->provider_parameters_values_count);
362-
}
363-
364336
SensitivityAnalysisParameters::SensitivityAnalysisParameters(sensitivity_analysis_parameters* src):
365337
loadflow_parameters(&src->loadflow_parameters)
366338
{
@@ -369,16 +341,15 @@ SensitivityAnalysisParameters::SensitivityAnalysisParameters(sensitivity_analysi
369341
}
370342

371343
std::shared_ptr<sensitivity_analysis_parameters> SensitivityAnalysisParameters::to_c_struct() const {
372-
sensitivity_analysis_parameters* res = new sensitivity_analysis_parameters();
344+
sensitivity_analysis_parameters* res = PowsyblCaller::get()->callJava<sensitivity_analysis_parameters*>(::createSensitivityAnalysisParameters);
373345
loadflow_parameters.load_to_c_struct(res->loadflow_parameters);
374346
res->provider_parameters_keys = pypowsybl::copyVectorStringToCharPtrPtr(provider_parameters_keys);
375347
res->provider_parameters_keys_count = provider_parameters_keys.size();
376348
res->provider_parameters_values = pypowsybl::copyVectorStringToCharPtrPtr(provider_parameters_values);
377349
res->provider_parameters_values_count = provider_parameters_values.size();
378350
//Memory has been allocated here on C side, we need to clean it up on C side (not java side)
379351
return std::shared_ptr<sensitivity_analysis_parameters>(res, [](sensitivity_analysis_parameters* ptr){
380-
deleteSensitivityAnalysisParameters(ptr);
381-
delete ptr;
352+
PowsyblCaller::get()->callJava(::freeSensitivityAnalysisParameters, ptr);
382353
});
383354
}
384355

@@ -392,7 +363,7 @@ FlowDecompositionParameters::FlowDecompositionParameters(flow_decomposition_para
392363
}
393364

394365
std::shared_ptr<flow_decomposition_parameters> FlowDecompositionParameters::to_c_struct() const {
395-
flow_decomposition_parameters* res = new flow_decomposition_parameters();
366+
flow_decomposition_parameters* res = PowsyblCaller::get()->callJava<flow_decomposition_parameters*>(::createFlowDecompositionParameters);
396367
res->enable_losses_compensation = (unsigned char) enable_losses_compensation;
397368
res->losses_compensation_epsilon = losses_compensation_epsilon;
398369
res->sensitivity_epsilon = sensitivity_epsilon;
@@ -401,7 +372,7 @@ std::shared_ptr<flow_decomposition_parameters> FlowDecompositionParameters::to_c
401372
res->sensitivity_variable_batch_size = (int) sensitivity_variable_batch_size;
402373
//Memory has been allocated here on C side, we need to clean it up on C side (not java side)
403374
return std::shared_ptr<flow_decomposition_parameters>(res, [](flow_decomposition_parameters* ptr){
404-
delete ptr;
375+
PowsyblCaller::get()->callJava(::freeFlowDecompositionParameters, ptr);
405376
});
406377
}
407378

@@ -771,27 +742,25 @@ void addOperatorStrategy(const JavaHandle& analysisContext, std::string operator
771742
}
772743

773744
::zone* createZone(const std::string& id, const std::vector<std::string>& injectionsIds, const std::vector<double>& injectionsShiftKeys) {
774-
auto z = new ::zone;
745+
auto z = PowsyblCaller::get()->callJava<zone*>(::createZonePointer);
775746
z->id = copyStringToCharPtr(id);
776747
z->length = injectionsIds.size();
777-
z->injections_ids = new char*[injectionsIds.size()];
748+
z->injections_ids = initializeCharPointerPointer(injectionsIds.size());
749+
z->injections_ids_count = injectionsIds.size();
778750
for (int i = 0; i < injectionsIds.size(); i++) {
779751
z->injections_ids[i] = copyStringToCharPtr(injectionsIds[i]);
780752
}
781-
z->injections_shift_keys = new double[injectionsShiftKeys.size()];
753+
z->injections_shift_keys = initializeDoublePointer(injectionsShiftKeys.size());
782754
for (int i = 0; i < injectionsIds.size(); i++) {
783755
z->injections_shift_keys[i] = injectionsShiftKeys[i];
784756
}
785757
return z;
786758
}
787759

788760
void deleteZone(::zone* z) {
789-
delete[] z->id;
790-
for (int i = 0; i < z->length; i++) {
791-
delete[] z->injections_ids[i];
792-
}
793-
delete[] z->injections_ids;
794-
delete[] z->injections_shift_keys;
761+
freeCharPointer(z->id);
762+
freeCharPointerPointer(z->injections_ids);
763+
freeDoublePointer(z->injections_shift_keys);
795764
}
796765

797766
class ZonesPtr {
@@ -1223,20 +1192,20 @@ void NadParameters::nad_to_c_struct(nad_parameters& res) const {
12231192
}
12241193

12251194
std::shared_ptr<sld_parameters> SldParameters::to_c_struct() const {
1226-
sld_parameters* res = new sld_parameters();
1195+
sld_parameters* res = PowsyblCaller::get()->callJava<sld_parameters*>(::createSldParameters);
12271196
sld_to_c_struct(*res);
12281197
//Memory has been allocated here on C side, we need to clean it up on C side (not java side)
12291198
return std::shared_ptr<sld_parameters>(res, [](sld_parameters* ptr){
1230-
delete ptr;
1199+
PowsyblCaller::get()->callJava(::freeSldParameters, ptr);
12311200
});
12321201
}
12331202

12341203
std::shared_ptr<nad_parameters> NadParameters::to_c_struct() const {
1235-
nad_parameters* res = new nad_parameters();
1204+
nad_parameters* res = PowsyblCaller::get()->callJava<nad_parameters*>(::createNadParameters);
12361205
nad_to_c_struct(*res);
12371206
//Memory has been allocated here on C side, we need to clean it up on C side (not java side)
12381207
return std::shared_ptr<nad_parameters>(res, [](nad_parameters* ptr){
1239-
delete ptr;
1208+
PowsyblCaller::get()->callJava(::freeNadParameters, ptr);
12401209
});
12411210
}
12421211

@@ -1358,7 +1327,7 @@ ShortCircuitAnalysisParameters::ShortCircuitAnalysisParameters(shortcircuit_anal
13581327
}
13591328

13601329
std::shared_ptr<shortcircuit_analysis_parameters> ShortCircuitAnalysisParameters::to_c_struct() const {
1361-
shortcircuit_analysis_parameters* res = new shortcircuit_analysis_parameters();
1330+
shortcircuit_analysis_parameters* res = PowsyblCaller::get()->callJava<shortcircuit_analysis_parameters*>(::createShortCircuitAnalysisParameters);
13621331
res->with_voltage_result = (bool) with_voltage_result;
13631332
res->with_feeder_result = (bool) with_feeder_result;
13641333
res->with_limit_violations = (bool) with_limit_violations;
@@ -1371,10 +1340,9 @@ std::shared_ptr<shortcircuit_analysis_parameters> ShortCircuitAnalysisParameters
13711340
res->provider_parameters_values = pypowsybl::copyVectorStringToCharPtrPtr(provider_parameters_values);
13721341
res->provider_parameters_values_count = provider_parameters_values.size();
13731342

1374-
//Memory has been allocated here on C side, we need to clean it up on C side (not java side)
13751343
return std::shared_ptr<shortcircuit_analysis_parameters>(res, [](shortcircuit_analysis_parameters* ptr){
13761344
deleteShortCircuitAnalysisParameters(ptr);
1377-
delete ptr;
1345+
PowsyblCaller::get()->callJava(::freeShortCircuitAnalysisParameters, ptr);
13781346
});
13791347
}
13801348

@@ -1508,4 +1476,60 @@ JavaHandle runVoltageInitializer(bool debug, const JavaHandle& networkHandle, co
15081476
return pypowsybl::PowsyblCaller::get()->callJava<JavaHandle>(::runVoltageInitializer, debug, networkHandle, paramsHandle);
15091477
}
15101478

1479+
SeriesArray* initializeSeriesArrayObject(int columnsNumber) {
1480+
return new SeriesArray(pypowsybl::PowsyblCaller::get()->callJava<array*>(::initializeSeriesArray, columnsNumber));
1481+
}
1482+
1483+
DataframesArray* initializeDataframesArray(int columnsNumber) {
1484+
return new DataframesArray(pypowsybl::PowsyblCaller::get()->callJava<array*>(::initializeDataframeArray, columnsNumber));
1485+
}
1486+
1487+
char** initializeCharPointerPointer(int size) {
1488+
return pypowsybl::PowsyblCaller::get()->callJava<char**>(::initializeCharCharPointer, size);
1489+
}
1490+
1491+
void freeCharPointerPointer(char** charPointerPointer) {
1492+
pypowsybl::PowsyblCaller::get()->callJava(::freeCharCharPointer, charPointerPointer);
1493+
}
1494+
1495+
char* initializeCharPointer(int size) {
1496+
return pypowsybl::PowsyblCaller::get()->callJava<char*>(::initializeCharPointer, size);
1497+
}
1498+
1499+
void freeCharPointer(char* charPointer) {
1500+
pypowsybl::PowsyblCaller::get()->callJava(::freeCharPointer, charPointer);
1501+
}
1502+
1503+
int* initializeIntPointer(int size) {
1504+
return pypowsybl::PowsyblCaller::get()->callJava<int*>(::initializeIntPointer, size);
1505+
}
1506+
1507+
void freeIntPointer(int* intPointer) {
1508+
pypowsybl::PowsyblCaller::get()->callJava(::freeIntPointer, intPointer);
1509+
}
1510+
1511+
double* initializeDoublePointer(double size) {
1512+
return pypowsybl::PowsyblCaller::get()->callJava<double*>(::initializeDoublePointer, size);
1513+
}
1514+
1515+
void freeDoublePointer(double* doublePointer) {
1516+
pypowsybl::PowsyblCaller::get()->callJava(::freeDoublePointer, doublePointer);
1517+
}
1518+
1519+
dataframe* initializeDataframePointer() {
1520+
return pypowsybl::PowsyblCaller::get()->callJava<dataframe*>(::initializeDataframePointer);
1521+
}
1522+
1523+
void freeDataframePointer(dataframe* dataframe) {
1524+
pypowsybl::PowsyblCaller::get()->callJava(::freeDataframePointer, dataframe);
1525+
}
1526+
1527+
dataframe_array* initializeDataframeArrayPointer() {
1528+
return pypowsybl::PowsyblCaller::get()->callJava<dataframe_array*>(::initializeDataframeArrayObject);
1529+
}
1530+
1531+
void freeDataframeArrayPointer(dataframe_array* dataframe_array) {
1532+
pypowsybl::PowsyblCaller::get()->callJava(::freeDataframeArrayObject, dataframe_array);
1533+
}
1534+
15111535
}

cpp/powsybl-cpp/powsybl-cpp.h

+15-1
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ typedef Array<post_contingency_result> PostContingencyResultArray;
190190
typedef Array<operator_strategy_result> OperatorStrategyResultArray;
191191
typedef Array<limit_violation> LimitViolationArray;
192192
typedef Array<series> SeriesArray;
193+
typedef Array<dataframe> DataframesArray;
193194

194195

195196
template<typename T>
@@ -788,6 +789,19 @@ SeriesArray* getFaultResults(const JavaHandle& shortCircuitAnalysisResult, bool
788789
SeriesArray* getFeederResults(const JavaHandle& shortCircuitAnalysisResult, bool withFortescueResult);
789790
SeriesArray* getShortCircuitLimitViolations(const JavaHandle& shortCircuitAnalysisResult);
790791
SeriesArray* getShortCircuitBusResults(const JavaHandle& shortCircuitAnalysisResult, bool withFortescueResult);
791-
792+
SeriesArray* initializeSeriesArrayObject(int columnsNumber);
793+
DataframesArray* initializeDataframesArray(int columnsNumber);
794+
char** initializeCharPointerPointer(int size);
795+
void freeCharPointerPointer(char** charPointerPointer);
796+
char* initializeCharPointer(int size);
797+
void freeCharPointer(char* charPointer);
798+
int* initializeIntPointer(int size);
799+
void freeIntPointer(int* intPointer);
800+
double* initializeDoublePointer(double size);
801+
void freeDoublePointer(double* doublePointer);
802+
dataframe* initializeDataframePointer();
803+
void freeDataframePointer(dataframe* dataframe);
804+
dataframe_array* initializeDataframeArrayPointer();
805+
void freeDataframeArrayPointer(dataframe_array* dataframe_array);
792806
}
793807
#endif //PYPOWSYBL_H

0 commit comments

Comments
 (0)