From 8090e0cac6c0bd3b2f357e73e9392ade61d62b88 Mon Sep 17 00:00:00 2001 From: Martin Weismann Date: Tue, 11 Dec 2018 11:34:08 +0100 Subject: [PATCH 01/22] Check version of dynamically loaded binaries CPP dynamic, Python, Pascal, Golang (untested) --- .../Bindings/C/libprimes.h | 26 +-- .../Bindings/C/libprimes_types.h | 7 +- .../Bindings/CDynamic/libprimes_dynamic.cpp | 2 +- .../Bindings/CDynamic/libprimes_dynamic.h | 2 +- .../Bindings/CDynamic/libprimes_types.h | 7 +- .../Bindings/Cpp/libprimes.cpp | 2 +- .../Bindings/Cpp/libprimes.h | 26 +-- .../Bindings/Cpp/libprimes.hpp | 2 +- .../Bindings/Cpp/libprimes_types.h | 7 +- .../Bindings/CppDynamic/libprimes_dynamic.h | 2 +- .../Bindings/CppDynamic/libprimes_dynamic.hpp | 154 +++++++++--------- .../Bindings/CppDynamic/libprimes_types.h | 7 +- .../Bindings/Pascal/Unit_LibPrimes.pas | 25 ++- .../Bindings/Python/LibPrimes.py | 21 ++- .../Examples/Python/LibPrimes_Example.py | 2 +- Examples/Primes/libPrimes.xml | 6 +- Source/automaticcomponenttoolkit.go | 2 +- Source/buildbindingcdynamic.go | 17 +- Source/buildbindingcpp.go | 2 +- Source/buildbindinggo.go | 47 ++++-- Source/buildbindingpascal.go | 44 +++-- Source/buildbindingpython.go | 18 ++ 22 files changed, 267 insertions(+), 161 deletions(-) diff --git a/Examples/Primes/LibPrimes_component/Bindings/C/libprimes.h b/Examples/Primes/LibPrimes_component/Bindings/C/libprimes.h index d6ebf0e3..175bce9e 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/C/libprimes.h +++ b/Examples/Primes/LibPrimes_component/Bindings/C/libprimes.h @@ -4,7 +4,7 @@ Copyright (C) 2018 Automatic Component Toolkit Developers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.1. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. Abstract: This is an autogenerated plain C Header file in order to allow an easy use of Prime Numbers Interface @@ -41,7 +41,7 @@ extern "C" { * @param[out] pValue - The current value of this Calculator * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_getvalue (LibPrimes_Calculator pCalculator, LibPrimes_uint64 * pValue); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_getvalue(LibPrimes_Calculator pCalculator, LibPrimes_uint64 * pValue); /** * Sets the value to be factorized @@ -50,7 +50,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_getvalue (LibPrimes_Calc * @param[in] nValue - The value to be factorized * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_setvalue (LibPrimes_Calculator pCalculator, LibPrimes_uint64 nValue); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_setvalue(LibPrimes_Calculator pCalculator, LibPrimes_uint64 nValue); /** * Sets the progress callback function @@ -59,7 +59,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_setvalue (LibPrimes_Calc * @param[in] pProgressCallback - The progress callback * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_setprogresscallback (LibPrimes_Calculator pCalculator, LibPrimesProgressCallback pProgressCallback); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_setprogresscallback(LibPrimes_Calculator pCalculator, LibPrimesProgressCallback pProgressCallback); /** * Performs the specific calculation of this Calculator @@ -67,7 +67,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_setprogresscallback (Lib * @param[in] pCalculator - Calculator instance. * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_calculate (LibPrimes_Calculator pCalculator); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_calculate(LibPrimes_Calculator pCalculator); /************************************************************************************************************************* Class definition for FactorizationCalculator @@ -82,7 +82,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_calculate (LibPrimes_Cal * @param[out] pPrimeFactorsBuffer - PrimeFactor buffer of The prime factors of this number * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_factorizationcalculator_getprimefactors (LibPrimes_FactorizationCalculator pFactorizationCalculator, const LibPrimes_uint64 nPrimeFactorsBufferSize, LibPrimes_uint64* pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_factorizationcalculator_getprimefactors(LibPrimes_FactorizationCalculator pFactorizationCalculator, const LibPrimes_uint64 nPrimeFactorsBufferSize, LibPrimes_uint64* pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer); /** * Checks, whether a list of prime factors (with multiplicity) is the prime factor decomposistion of the calculator's value @@ -93,7 +93,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_factorizationcalculator_getprimefac * @param[out] pAreEqual - Do the prime factors decompose this calculator's value * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_factorizationcalculator_checkprimefactors (LibPrimes_FactorizationCalculator pFactorizationCalculator, LibPrimes_uint64 nPrimeFactorsBufferSize, const sLibPrimesPrimeFactor * pPrimeFactorsBuffer, bool * pAreEqual); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_factorizationcalculator_checkprimefactors(LibPrimes_FactorizationCalculator pFactorizationCalculator, LibPrimes_uint64 nPrimeFactorsBufferSize, const sLibPrimesPrimeFactor * pPrimeFactorsBuffer, bool * pAreEqual); /************************************************************************************************************************* Class definition for SieveCalculator @@ -108,7 +108,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_factorizationcalculator_checkprimef * @param[out] pPrimesBuffer - uint64 buffer of The primes lower or equal to the sieve's value * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_sievecalculator_getprimes (LibPrimes_SieveCalculator pSieveCalculator, const LibPrimes_uint64 nPrimesBufferSize, LibPrimes_uint64* pPrimesNeededCount, LibPrimes_uint64 * pPrimesBuffer); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_sievecalculator_getprimes(LibPrimes_SieveCalculator pSieveCalculator, const LibPrimes_uint64 nPrimesBufferSize, LibPrimes_uint64* pPrimesNeededCount, LibPrimes_uint64 * pPrimesBuffer); /************************************************************************************************************************* Global functions @@ -120,7 +120,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_sievecalculator_getprimes (LibPrime * @param[out] pInstance - New FactorizationCalculator instance * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_createfactorizationcalculator (LibPrimes_FactorizationCalculator * pInstance); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_createfactorizationcalculator(LibPrimes_FactorizationCalculator * pInstance); /** * Creates a new SieveCalculator instance @@ -128,7 +128,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_createfactorizationcalculator (LibP * @param[out] pInstance - New SieveCalculator instance * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_createsievecalculator (LibPrimes_SieveCalculator * pInstance); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_createsievecalculator(LibPrimes_SieveCalculator * pInstance); /** * Releases the memory of an Instance @@ -136,7 +136,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_createsievecalculator (LibPrimes_Si * @param[in] pInstance - Instance Handle * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_releaseinstance (LibPrimes_BaseClass pInstance); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_releaseinstance(LibPrimes_BaseClass pInstance); /** * retrieves the current version of the library. @@ -146,7 +146,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_releaseinstance (LibPrimes_BaseClas * @param[out] pMicro - returns the micro version of the library * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_getlibraryversion (LibPrimes_uint32 * pMajor, LibPrimes_uint32 * pMinor, LibPrimes_uint32 * pMicro); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_getlibraryversion(LibPrimes_uint32 * pMajor, LibPrimes_uint32 * pMinor, LibPrimes_uint32 * pMicro); /** * Handles Library Journaling @@ -154,7 +154,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_getlibraryversion (LibPrimes_uint32 * @param[in] pFileName - Journal FileName * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_setjournal (const char * pFileName); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_setjournal(const char * pFileName); } diff --git a/Examples/Primes/LibPrimes_component/Bindings/C/libprimes_types.h b/Examples/Primes/LibPrimes_component/Bindings/C/libprimes_types.h index 92b19290..1eb111f0 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/C/libprimes_types.h +++ b/Examples/Primes/LibPrimes_component/Bindings/C/libprimes_types.h @@ -4,7 +4,7 @@ Copyright (C) 2018 Automatic Component Toolkit Developers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.1. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. Abstract: This is an autogenerated plain C Header file with basic types in order to allow an easy use of Prime Numbers Interface @@ -76,8 +76,9 @@ typedef void * LibPrimesHandle; #define LIBPRIMES_ERROR_GENERICEXCEPTION 5 #define LIBPRIMES_ERROR_COULDNOTLOADLIBRARY 6 #define LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT 7 -#define LIBPRIMES_ERROR_NORESULTAVAILABLE 8 -#define LIBPRIMES_ERROR_CALCULATIONABORTED 9 +#define LIBPRIMES_ERROR_INCOMPATIBLEBINARYVERSION 8 +#define LIBPRIMES_ERROR_NORESULTAVAILABLE 9 +#define LIBPRIMES_ERROR_CALCULATIONABORTED 10 /************************************************************************************************************************* Declaration of handle classes diff --git a/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_dynamic.cpp b/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_dynamic.cpp index dbef9399..e29aa9d6 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_dynamic.cpp +++ b/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_dynamic.cpp @@ -4,7 +4,7 @@ Copyright (C) 2018 Automatic Component Toolkit Developers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.1. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. Abstract: This is an autogenerated plain C Header file in order to allow an easy use of Prime Numbers Interface diff --git a/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_dynamic.h b/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_dynamic.h index 9f4e96cb..87d0e523 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_dynamic.h +++ b/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_dynamic.h @@ -4,7 +4,7 @@ Copyright (C) 2018 Automatic Component Toolkit Developers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.1. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. Abstract: This is an autogenerated plain C Header file in order to allow an easy use of Prime Numbers Interface diff --git a/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_types.h b/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_types.h index 92b19290..1eb111f0 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_types.h +++ b/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_types.h @@ -4,7 +4,7 @@ Copyright (C) 2018 Automatic Component Toolkit Developers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.1. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. Abstract: This is an autogenerated plain C Header file with basic types in order to allow an easy use of Prime Numbers Interface @@ -76,8 +76,9 @@ typedef void * LibPrimesHandle; #define LIBPRIMES_ERROR_GENERICEXCEPTION 5 #define LIBPRIMES_ERROR_COULDNOTLOADLIBRARY 6 #define LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT 7 -#define LIBPRIMES_ERROR_NORESULTAVAILABLE 8 -#define LIBPRIMES_ERROR_CALCULATIONABORTED 9 +#define LIBPRIMES_ERROR_INCOMPATIBLEBINARYVERSION 8 +#define LIBPRIMES_ERROR_NORESULTAVAILABLE 9 +#define LIBPRIMES_ERROR_CALCULATIONABORTED 10 /************************************************************************************************************************* Declaration of handle classes diff --git a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.cpp b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.cpp index eccdeba8..baafb002 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.cpp +++ b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.cpp @@ -4,7 +4,7 @@ Copyright (C) 2018 Automatic Component Toolkit Developers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.1. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. Abstract: This is an autogenerated C++ Wrapper Implementation file in order to allow an easy use of Prime Numbers Interface diff --git a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.h b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.h index d6ebf0e3..175bce9e 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.h +++ b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.h @@ -4,7 +4,7 @@ Copyright (C) 2018 Automatic Component Toolkit Developers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.1. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. Abstract: This is an autogenerated plain C Header file in order to allow an easy use of Prime Numbers Interface @@ -41,7 +41,7 @@ extern "C" { * @param[out] pValue - The current value of this Calculator * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_getvalue (LibPrimes_Calculator pCalculator, LibPrimes_uint64 * pValue); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_getvalue(LibPrimes_Calculator pCalculator, LibPrimes_uint64 * pValue); /** * Sets the value to be factorized @@ -50,7 +50,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_getvalue (LibPrimes_Calc * @param[in] nValue - The value to be factorized * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_setvalue (LibPrimes_Calculator pCalculator, LibPrimes_uint64 nValue); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_setvalue(LibPrimes_Calculator pCalculator, LibPrimes_uint64 nValue); /** * Sets the progress callback function @@ -59,7 +59,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_setvalue (LibPrimes_Calc * @param[in] pProgressCallback - The progress callback * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_setprogresscallback (LibPrimes_Calculator pCalculator, LibPrimesProgressCallback pProgressCallback); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_setprogresscallback(LibPrimes_Calculator pCalculator, LibPrimesProgressCallback pProgressCallback); /** * Performs the specific calculation of this Calculator @@ -67,7 +67,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_setprogresscallback (Lib * @param[in] pCalculator - Calculator instance. * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_calculate (LibPrimes_Calculator pCalculator); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_calculate(LibPrimes_Calculator pCalculator); /************************************************************************************************************************* Class definition for FactorizationCalculator @@ -82,7 +82,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_calculate (LibPrimes_Cal * @param[out] pPrimeFactorsBuffer - PrimeFactor buffer of The prime factors of this number * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_factorizationcalculator_getprimefactors (LibPrimes_FactorizationCalculator pFactorizationCalculator, const LibPrimes_uint64 nPrimeFactorsBufferSize, LibPrimes_uint64* pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_factorizationcalculator_getprimefactors(LibPrimes_FactorizationCalculator pFactorizationCalculator, const LibPrimes_uint64 nPrimeFactorsBufferSize, LibPrimes_uint64* pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer); /** * Checks, whether a list of prime factors (with multiplicity) is the prime factor decomposistion of the calculator's value @@ -93,7 +93,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_factorizationcalculator_getprimefac * @param[out] pAreEqual - Do the prime factors decompose this calculator's value * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_factorizationcalculator_checkprimefactors (LibPrimes_FactorizationCalculator pFactorizationCalculator, LibPrimes_uint64 nPrimeFactorsBufferSize, const sLibPrimesPrimeFactor * pPrimeFactorsBuffer, bool * pAreEqual); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_factorizationcalculator_checkprimefactors(LibPrimes_FactorizationCalculator pFactorizationCalculator, LibPrimes_uint64 nPrimeFactorsBufferSize, const sLibPrimesPrimeFactor * pPrimeFactorsBuffer, bool * pAreEqual); /************************************************************************************************************************* Class definition for SieveCalculator @@ -108,7 +108,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_factorizationcalculator_checkprimef * @param[out] pPrimesBuffer - uint64 buffer of The primes lower or equal to the sieve's value * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_sievecalculator_getprimes (LibPrimes_SieveCalculator pSieveCalculator, const LibPrimes_uint64 nPrimesBufferSize, LibPrimes_uint64* pPrimesNeededCount, LibPrimes_uint64 * pPrimesBuffer); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_sievecalculator_getprimes(LibPrimes_SieveCalculator pSieveCalculator, const LibPrimes_uint64 nPrimesBufferSize, LibPrimes_uint64* pPrimesNeededCount, LibPrimes_uint64 * pPrimesBuffer); /************************************************************************************************************************* Global functions @@ -120,7 +120,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_sievecalculator_getprimes (LibPrime * @param[out] pInstance - New FactorizationCalculator instance * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_createfactorizationcalculator (LibPrimes_FactorizationCalculator * pInstance); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_createfactorizationcalculator(LibPrimes_FactorizationCalculator * pInstance); /** * Creates a new SieveCalculator instance @@ -128,7 +128,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_createfactorizationcalculator (LibP * @param[out] pInstance - New SieveCalculator instance * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_createsievecalculator (LibPrimes_SieveCalculator * pInstance); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_createsievecalculator(LibPrimes_SieveCalculator * pInstance); /** * Releases the memory of an Instance @@ -136,7 +136,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_createsievecalculator (LibPrimes_Si * @param[in] pInstance - Instance Handle * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_releaseinstance (LibPrimes_BaseClass pInstance); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_releaseinstance(LibPrimes_BaseClass pInstance); /** * retrieves the current version of the library. @@ -146,7 +146,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_releaseinstance (LibPrimes_BaseClas * @param[out] pMicro - returns the micro version of the library * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_getlibraryversion (LibPrimes_uint32 * pMajor, LibPrimes_uint32 * pMinor, LibPrimes_uint32 * pMicro); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_getlibraryversion(LibPrimes_uint32 * pMajor, LibPrimes_uint32 * pMinor, LibPrimes_uint32 * pMicro); /** * Handles Library Journaling @@ -154,7 +154,7 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_getlibraryversion (LibPrimes_uint32 * @param[in] pFileName - Journal FileName * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_setjournal (const char * pFileName); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_setjournal(const char * pFileName); } diff --git a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.hpp b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.hpp index 1999bf39..cd5f3734 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.hpp +++ b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.hpp @@ -4,7 +4,7 @@ Copyright (C) 2018 Automatic Component Toolkit Developers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.1. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. Abstract: This is an autogenerated C++ Header file in order to allow an easy use of Prime Numbers Interface diff --git a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes_types.h b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes_types.h index 92b19290..1eb111f0 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes_types.h +++ b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes_types.h @@ -4,7 +4,7 @@ Copyright (C) 2018 Automatic Component Toolkit Developers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.1. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. Abstract: This is an autogenerated plain C Header file with basic types in order to allow an easy use of Prime Numbers Interface @@ -76,8 +76,9 @@ typedef void * LibPrimesHandle; #define LIBPRIMES_ERROR_GENERICEXCEPTION 5 #define LIBPRIMES_ERROR_COULDNOTLOADLIBRARY 6 #define LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT 7 -#define LIBPRIMES_ERROR_NORESULTAVAILABLE 8 -#define LIBPRIMES_ERROR_CALCULATIONABORTED 9 +#define LIBPRIMES_ERROR_INCOMPATIBLEBINARYVERSION 8 +#define LIBPRIMES_ERROR_NORESULTAVAILABLE 9 +#define LIBPRIMES_ERROR_CALCULATIONABORTED 10 /************************************************************************************************************************* Declaration of handle classes diff --git a/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.h b/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.h index f97c0e33..67e6a262 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.h +++ b/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.h @@ -4,7 +4,7 @@ Copyright (C) 2018 Automatic Component Toolkit Developers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.1. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. Abstract: This is an autogenerated plain C Header file in order to allow an easy use of Prime Numbers Interface diff --git a/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.hpp b/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.hpp index 26ce4c9b..3e897e86 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.hpp +++ b/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.hpp @@ -4,7 +4,7 @@ Copyright (C) 2018 Automatic Component Toolkit Developers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.1. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. Abstract: This is an autogenerated C++ Header file in order to allow an easy use of Prime Numbers Interface @@ -137,6 +137,8 @@ class CLibPrimesWrapper { { CheckError (nullptr, initWrapperTable (&m_WrapperTable)); CheckError (nullptr, loadWrapperTable (&m_WrapperTable, sFileName.c_str ())); + + CheckError(nullptr, CheckVersion()); } static PLibPrimesWrapper loadLibrary (const std::string &sFileName) @@ -165,6 +167,14 @@ class CLibPrimesWrapper { private: sLibPrimesDynamicWrapperTable m_WrapperTable; + LibPrimesResult CheckVersion() { + LibPrimes_uint32 nMajor, nMinor, nMicro; + GetLibraryVersion(nMajor, nMinor, nMicro); + if ( (nMajor != LIBPRIMES_VERSION_MAJOR) || (nMinor < LIBPRIMES_VERSION_MINOR) ) { + return LIBPRIMES_ERROR_INCOMPATIBLEBINARYVERSION; + } + return LIBPRIMES_SUCCESS; + } LibPrimesResult initWrapperTable (sLibPrimesDynamicWrapperTable * pWrapperTable); LibPrimesResult releaseWrapperTable (sLibPrimesDynamicWrapperTable * pWrapperTable); LibPrimesResult loadWrapperTable (sLibPrimesDynamicWrapperTable * pWrapperTable, const char * pLibraryFileName); @@ -236,43 +246,10 @@ class CLibPrimesCalculator : public CLibPrimesBaseClass { { } - - /** - * CLibPrimesCalculator::GetValue - Returns the current value of this Calculator - * @return The current value of this Calculator - */ - LibPrimes_uint64 GetValue () - { - LibPrimes_uint64 resultValue = 0; - CheckError ( m_pWrapper->m_WrapperTable.m_Calculator_GetValue (m_pHandle, &resultValue) ); - return resultValue; - } - - /** - * CLibPrimesCalculator::SetValue - Sets the value to be factorized - * @param[in] nValue - The value to be factorized - */ - void SetValue (const LibPrimes_uint64 nValue) - { - CheckError ( m_pWrapper->m_WrapperTable.m_Calculator_SetValue (m_pHandle, nValue) ); - } - - /** - * CLibPrimesCalculator::SetProgressCallback - Sets the progress callback function - * @param[in] pProgressCallback - The progress callback - */ - void SetProgressCallback (const LibPrimesProgressCallback pProgressCallback) - { - CheckError ( m_pWrapper->m_WrapperTable.m_Calculator_SetProgressCallback (m_pHandle, pProgressCallback) ); - } - - /** - * CLibPrimesCalculator::Calculate - Performs the specific calculation of this Calculator - */ - void Calculate () - { - CheckError ( m_pWrapper->m_WrapperTable.m_Calculator_Calculate (m_pHandle) ); - } + LibPrimes_uint64 GetValue (); + void SetValue (const LibPrimes_uint64 nValue); + void SetProgressCallback (const LibPrimesProgressCallback pProgressCallback); + void Calculate (); }; /************************************************************************************************************************* @@ -289,31 +266,8 @@ class CLibPrimesFactorizationCalculator : public CLibPrimesCalculator { { } - - /** - * CLibPrimesFactorizationCalculator::GetPrimeFactors - Returns the prime factors of this number (with multiplicity) - * @param[out] PrimeFactorsBuffer - The prime factors of this number - */ - void GetPrimeFactors (std::vector & PrimeFactorsBuffer) - { - LibPrimes_uint64 elementsNeededPrimeFactors = 0; - LibPrimes_uint64 elementsWrittenPrimeFactors = 0; - CheckError ( m_pWrapper->m_WrapperTable.m_FactorizationCalculator_GetPrimeFactors (m_pHandle, 0, &elementsNeededPrimeFactors, nullptr) ); - PrimeFactorsBuffer.resize(elementsNeededPrimeFactors); - CheckError ( m_pWrapper->m_WrapperTable.m_FactorizationCalculator_GetPrimeFactors (m_pHandle, elementsNeededPrimeFactors, &elementsWrittenPrimeFactors, PrimeFactorsBuffer.data()) ); - } - - /** - * CLibPrimesFactorizationCalculator::CheckPrimeFactors - Checks, whether a list of prime factors (with multiplicity) is the prime factor decomposistion of the calculator's value - * @param[in] PrimeFactorsBuffer - - * @return Do the prime factors decompose this calculator's value - */ - bool CheckPrimeFactors (const CLibPrimesInputVector & PrimeFactorsBuffer) - { - bool resultAreEqual = 0; - CheckError ( m_pWrapper->m_WrapperTable.m_FactorizationCalculator_CheckPrimeFactors (m_pHandle, (LibPrimes_uint64)PrimeFactorsBuffer.size(), PrimeFactorsBuffer.data(), &resultAreEqual) ); - return resultAreEqual; - } + void GetPrimeFactors (std::vector & PrimeFactorsBuffer); + bool CheckPrimeFactors (const CLibPrimesInputVector & PrimeFactorsBuffer); }; /************************************************************************************************************************* @@ -330,19 +284,7 @@ class CLibPrimesSieveCalculator : public CLibPrimesCalculator { { } - - /** - * CLibPrimesSieveCalculator::GetPrimes - Returns all prime numbers lower or equal to the sieve's value - * @param[out] PrimesBuffer - The primes lower or equal to the sieve's value - */ - void GetPrimes (std::vector & PrimesBuffer) - { - LibPrimes_uint64 elementsNeededPrimes = 0; - LibPrimes_uint64 elementsWrittenPrimes = 0; - CheckError ( m_pWrapper->m_WrapperTable.m_SieveCalculator_GetPrimes (m_pHandle, 0, &elementsNeededPrimes, nullptr) ); - PrimesBuffer.resize(elementsNeededPrimes); - CheckError ( m_pWrapper->m_WrapperTable.m_SieveCalculator_GetPrimes (m_pHandle, elementsNeededPrimes, &elementsWrittenPrimes, PrimesBuffer.data()) ); - } + void GetPrimes (std::vector & PrimesBuffer); }; /** @@ -569,6 +511,66 @@ class CLibPrimesSieveCalculator : public CLibPrimesCalculator { pWrapperTable->m_LibraryHandle = hLibrary; return LIBPRIMES_SUCCESS; } + + + /** + * Method definitions for class CLibPrimesCalculator + */ + + LibPrimes_uint64 CLibPrimesCalculator::GetValue () + { + LibPrimes_uint64 resultValue = 0; + CheckError ( m_pWrapper->m_WrapperTable.m_Calculator_GetValue (m_pHandle, &resultValue) ); + return resultValue; + } + + void CLibPrimesCalculator::SetValue (const LibPrimes_uint64 nValue) + { + CheckError ( m_pWrapper->m_WrapperTable.m_Calculator_SetValue (m_pHandle, nValue) ); + } + + void CLibPrimesCalculator::SetProgressCallback (const LibPrimesProgressCallback pProgressCallback) + { + CheckError ( m_pWrapper->m_WrapperTable.m_Calculator_SetProgressCallback (m_pHandle, pProgressCallback) ); + } + + void CLibPrimesCalculator::Calculate () + { + CheckError ( m_pWrapper->m_WrapperTable.m_Calculator_Calculate (m_pHandle) ); + } + + /** + * Method definitions for class CLibPrimesFactorizationCalculator + */ + + void CLibPrimesFactorizationCalculator::GetPrimeFactors (std::vector & PrimeFactorsBuffer) + { + LibPrimes_uint64 elementsNeededPrimeFactors = 0; + LibPrimes_uint64 elementsWrittenPrimeFactors = 0; + CheckError ( m_pWrapper->m_WrapperTable.m_FactorizationCalculator_GetPrimeFactors (m_pHandle, 0, &elementsNeededPrimeFactors, nullptr) ); + PrimeFactorsBuffer.resize(elementsNeededPrimeFactors); + CheckError ( m_pWrapper->m_WrapperTable.m_FactorizationCalculator_GetPrimeFactors (m_pHandle, elementsNeededPrimeFactors, &elementsWrittenPrimeFactors, PrimeFactorsBuffer.data()) ); + } + + bool CLibPrimesFactorizationCalculator::CheckPrimeFactors (const CLibPrimesInputVector & PrimeFactorsBuffer) + { + bool resultAreEqual = 0; + CheckError ( m_pWrapper->m_WrapperTable.m_FactorizationCalculator_CheckPrimeFactors (m_pHandle, (LibPrimes_uint64)PrimeFactorsBuffer.size(), PrimeFactorsBuffer.data(), &resultAreEqual) ); + return resultAreEqual; + } + + /** + * Method definitions for class CLibPrimesSieveCalculator + */ + + void CLibPrimesSieveCalculator::GetPrimes (std::vector & PrimesBuffer) + { + LibPrimes_uint64 elementsNeededPrimes = 0; + LibPrimes_uint64 elementsWrittenPrimes = 0; + CheckError ( m_pWrapper->m_WrapperTable.m_SieveCalculator_GetPrimes (m_pHandle, 0, &elementsNeededPrimes, nullptr) ); + PrimesBuffer.resize(elementsNeededPrimes); + CheckError ( m_pWrapper->m_WrapperTable.m_SieveCalculator_GetPrimes (m_pHandle, elementsNeededPrimes, &elementsWrittenPrimes, PrimesBuffer.data()) ); + } } // namespace LibPrimes diff --git a/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_types.h b/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_types.h index 92b19290..1eb111f0 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_types.h +++ b/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_types.h @@ -4,7 +4,7 @@ Copyright (C) 2018 Automatic Component Toolkit Developers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.1. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. Abstract: This is an autogenerated plain C Header file with basic types in order to allow an easy use of Prime Numbers Interface @@ -76,8 +76,9 @@ typedef void * LibPrimesHandle; #define LIBPRIMES_ERROR_GENERICEXCEPTION 5 #define LIBPRIMES_ERROR_COULDNOTLOADLIBRARY 6 #define LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT 7 -#define LIBPRIMES_ERROR_NORESULTAVAILABLE 8 -#define LIBPRIMES_ERROR_CALCULATIONABORTED 9 +#define LIBPRIMES_ERROR_INCOMPATIBLEBINARYVERSION 8 +#define LIBPRIMES_ERROR_NORESULTAVAILABLE 9 +#define LIBPRIMES_ERROR_CALCULATIONABORTED 10 /************************************************************************************************************************* Declaration of handle classes diff --git a/Examples/Primes/LibPrimes_component/Bindings/Pascal/Unit_LibPrimes.pas b/Examples/Primes/LibPrimes_component/Bindings/Pascal/Unit_LibPrimes.pas index 84befe46..367ea11f 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/Pascal/Unit_LibPrimes.pas +++ b/Examples/Primes/LibPrimes_component/Bindings/Pascal/Unit_LibPrimes.pas @@ -5,7 +5,7 @@ All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.1. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. Abstract: This is an autogenerated Pascal Header file in order to allow an easy use of Prime Numbers Interface @@ -62,8 +62,9 @@ interface LIBPRIMES_ERROR_GENERICEXCEPTION = 5; LIBPRIMES_ERROR_COULDNOTLOADLIBRARY = 6; LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT = 7; - LIBPRIMES_ERROR_NORESULTAVAILABLE = 8; - LIBPRIMES_ERROR_CALCULATIONABORTED = 9; + LIBPRIMES_ERROR_INCOMPATIBLEBINARYVERSION = 8; + LIBPRIMES_ERROR_NORESULTAVAILABLE = 9; + LIBPRIMES_ERROR_CALCULATIONABORTED = 10; (************************************************************************************************************************* Declaration of structs @@ -88,7 +89,9 @@ interface Declaration of function types **************************************************************************************************************************) - PLibPrimes_ProgressCallback = function(const fProgressPercentage: Single; out pShouldAbort: Cardinal): Integer; +type + + PLibPrimes_ProgressCallback = function(const fProgressPercentage: Single; out pShouldAbort: Cardinal): Integer; cdecl; (************************************************************************************************************************* Declaration of handle classes @@ -327,6 +330,8 @@ TLibPrimesWrapper = class (TObject) function LoadFunction (AFunctionName: AnsiString; FailIfNotExistent: Boolean = True): Pointer; {$ENDIF MSWINDOWS} + procedure CheckVersion(); + protected property LibPrimesCalculator_GetValueFunc: TLibPrimesCalculator_GetValueFunc read FLibPrimesCalculator_GetValueFunc; property LibPrimesCalculator_SetValueFunc: TLibPrimesCalculator_SetValueFunc read FLibPrimesCalculator_SetValueFunc; @@ -372,6 +377,7 @@ implementation LIBPRIMES_ERROR_GENERICEXCEPTION: ADescription := 'a generic exception occurred'; LIBPRIMES_ERROR_COULDNOTLOADLIBRARY: ADescription := 'the library could not be loaded'; LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT: ADescription := 'a required exported symbol could not be found in the library'; + LIBPRIMES_ERROR_INCOMPATIBLEBINARYVERSION: ADescription := 'the version of the binary interface does not match the bindings interface'; LIBPRIMES_ERROR_NORESULTAVAILABLE: ADescription := 'no result is available'; LIBPRIMES_ERROR_CALCULATIONABORTED: ADescription := 'a calculation has been aborted'; else @@ -549,6 +555,8 @@ implementation FLibPrimesReleaseInstanceFunc := LoadFunction ('libprimes_releaseinstance'); FLibPrimesGetLibraryVersionFunc := LoadFunction ('libprimes_getlibraryversion'); FLibPrimesSetJournalFunc := LoadFunction ('libprimes_setjournal'); + + CheckVersion(); end; destructor TLibPrimesWrapper.Destroy; @@ -589,6 +597,15 @@ implementation end; {$ENDIF MSWINDOWS} + procedure TLibPrimesWrapper.CheckVersion(); + var + AMajor, AMinor, AMicro: Cardinal; + begin + GetLibraryVersion(AMajor, AMinor, AMicro); + if (AMajor <> LIBPRIMES_VERSION_MAJOR) or (AMinor < LIBPRIMES_VERSION_MINOR) then + raise ELibPrimesException.Create(LIBPRIMES_ERROR_INCOMPATIBLEBINARYVERSION); + end; + function TLibPrimesWrapper.CreateFactorizationCalculator(): TLibPrimesFactorizationCalculator; var HInstance: TLibPrimesHandle; diff --git a/Examples/Primes/LibPrimes_component/Bindings/Python/LibPrimes.py b/Examples/Primes/LibPrimes_component/Bindings/Python/LibPrimes.py index 87eb9aa8..1b653deb 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/Python/LibPrimes.py +++ b/Examples/Primes/LibPrimes_component/Bindings/Python/LibPrimes.py @@ -4,7 +4,7 @@ All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.1. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. Abstract: This is an autogenerated Python file in order to allow an easy use of Prime Numbers Interface @@ -30,6 +30,13 @@ def __str__(self): return 'LibPrimesException ' + str(self._code) + ': '+ str(self._message) return 'LibPrimesException ' + str(self._code) +'''Definition of binding API version +''' +class LibPrimesBindingVersion(enum.IntEnum): + MAJOR = 1 + MINOR = 3 + MICRO = 0 + '''Definition Error Codes ''' class LibPrimesErrorCodes(enum.IntEnum): @@ -41,8 +48,9 @@ class LibPrimesErrorCodes(enum.IntEnum): GENERICEXCEPTION = 5 COULDNOTLOADLIBRARY = 6 COULDNOTFINDLIBRARYEXPORT = 7 - NORESULTAVAILABLE = 8 - CALCULATIONABORTED = 9 + INCOMPATIBLEBINARYVERSION = 8 + NORESULTAVAILABLE = 9 + CALCULATIONABORTED = 10 '''Definition of Structs ''' @@ -86,6 +94,8 @@ def __init__(self, libraryName): raise ELibPrimesException(LibPrimesErrorCodes.COULDNOTLOADLIBRARY, str(e) + '| "'+path + '"' ) self._loadFunctionTable() + + self._checkVersion() def _loadFunctionTable(self): try: @@ -128,6 +138,11 @@ def _loadFunctionTable(self): except AttributeError as ae: raise ELibPrimesException(LibPrimesErrorCodes.COULDNOTFINDLIBRARYEXPORT, ae.args[0]) + def _checkVersion(self): + nMajor, nMinor, _ = self.GetLibraryVersion() + if (nMajor != LibPrimesBindingVersion.MAJOR) or (nMinor < LibPrimesBindingVersion.MINOR): + raise ELibPrimesException(LibPrimesErrorCodes.INCOMPATIBLEBINARYVERSION) + def checkError(self, instance, errorCode): if instance: if instance._wrapper != self: diff --git a/Examples/Primes/LibPrimes_component/Examples/Python/LibPrimes_Example.py b/Examples/Primes/LibPrimes_component/Examples/Python/LibPrimes_Example.py index c6d26a70..d90d6dc9 100644 --- a/Examples/Primes/LibPrimes_component/Examples/Python/LibPrimes_Example.py +++ b/Examples/Primes/LibPrimes_component/Examples/Python/LibPrimes_Example.py @@ -13,7 +13,7 @@ def progressCallback(progress, shouldAbort): print("Progress = {:d}%".format(round(progress*100))) if (shouldAbort is not None): - shouldAbort[0] = progress > 0.5; + shouldAbort[0] = progress > 0.5 import os diff --git a/Examples/Primes/libPrimes.xml b/Examples/Primes/libPrimes.xml index 8512c97d..e24f0efd 100644 --- a/Examples/Primes/libPrimes.xml +++ b/Examples/Primes/libPrimes.xml @@ -13,6 +13,7 @@ + @@ -27,8 +28,9 @@ - - + + + diff --git a/Source/automaticcomponenttoolkit.go b/Source/automaticcomponenttoolkit.go index 3ad4ccfb..eefc3aab 100644 --- a/Source/automaticcomponenttoolkit.go +++ b/Source/automaticcomponenttoolkit.go @@ -69,7 +69,7 @@ func readComponentDefinition(FileName string, ACTVersion string) (ComponentDefin } func main () { - ACTVersion := "1.3.2" + ACTVersion := "1.3.3" fmt.Fprintln(os.Stdout, "Automatic Component Toolkit v" + ACTVersion) if (len (os.Args) < 2) { log.Fatal ("Please run with the Interface Description XML as command line parameter."); diff --git a/Source/buildbindingcdynamic.go b/Source/buildbindingcdynamic.go index cf313555..ef10f1f2 100644 --- a/Source/buildbindingcdynamic.go +++ b/Source/buildbindingcdynamic.go @@ -721,6 +721,8 @@ func buildDynamicCppHeader(component ComponentDefinition, w LanguageWriter, Name w.Writeln(" {") w.Writeln(" CheckError (nullptr, initWrapperTable (&m_WrapperTable));") w.Writeln(" CheckError (nullptr, loadWrapperTable (&m_WrapperTable, sFileName.c_str ()));") + w.Writeln(" ") + w.Writeln(" CheckError(nullptr, checkBinaryVersion());") w.Writeln(" }") w.Writeln(" ") @@ -754,11 +756,22 @@ func buildDynamicCppHeader(component ComponentDefinition, w LanguageWriter, Name return err } } - + w.Writeln("") w.Writeln("private:") w.Writeln(" s%sDynamicWrapperTable m_WrapperTable;", NameSpace) w.Writeln("") + + w.Writeln(" %sResult checkBinaryVersion()", NameSpace) + w.Writeln(" {") + w.Writeln(" %s_uint32 nMajor, nMinor, nMicro;", NameSpace) + w.Writeln(" %s(nMajor, nMinor, nMicro);", global.VersionMethod) + w.Writeln(" if ( (nMajor != %s_VERSION_MAJOR) || (nMinor < %s_VERSION_MINOR) ) {", strings.ToUpper(NameSpace), strings.ToUpper(NameSpace) ) + w.Writeln(" return %s_ERROR_INCOMPATIBLEBINARYVERSION;", strings.ToUpper(NameSpace)) + w.Writeln(" }") + w.Writeln(" return %s_SUCCESS;", strings.ToUpper(NameSpace)) + w.Writeln(" }") + w.Writeln(" %sResult initWrapperTable (s%sDynamicWrapperTable * pWrapperTable);", NameSpace, NameSpace) w.Writeln(" %sResult releaseWrapperTable (s%sDynamicWrapperTable * pWrapperTable);", NameSpace, NameSpace) w.Writeln(" %sResult loadWrapperTable (s%sDynamicWrapperTable * pWrapperTable, const char * pLibraryFileName);", NameSpace, NameSpace) @@ -1023,7 +1036,7 @@ func buildDynamicCppExample(componentdefinition ComponentDefinition, w LanguageW w.Writeln(" std::string libpath = (\"\"); // TODO: put the location of the %s-library file here.", NameSpace) w.Writeln(" auto wrapper = %s::C%sWrapper::loadLibrary(libpath + \"/%s.\"); // TODO: add correct suffix of the library", NameSpace, NameSpace, BaseName) w.Writeln(" unsigned int nMajor, nMinor, nMicro;") - w.Writeln(" wrapper->GetLibraryVersion(nMajor, nMinor, nMicro);") + w.Writeln(" wrapper->%s(nMajor, nMinor, nMicro);", componentdefinition.Global.VersionMethod) w.Writeln(" std::cout << \"%s.Version = \" << nMajor << \".\" << nMinor << \".\" << nMicro << std::endl;", NameSpace); w.Writeln(" }") w.Writeln(" catch (std::exception &e)") diff --git a/Source/buildbindingcpp.go b/Source/buildbindingcpp.go index b08c0292..7e807999 100644 --- a/Source/buildbindingcpp.go +++ b/Source/buildbindingcpp.go @@ -755,7 +755,7 @@ func buildCppExample(componentdefinition ComponentDefinition, w LanguageWriter, w.Writeln(" try") w.Writeln(" {") w.Writeln(" unsigned int nMajor, nMinor, nMicro;") - w.Writeln(" %s::C%sWrapper::GetLibraryVersion(nMajor, nMinor, nMicro);", NameSpace, NameSpace) + w.Writeln(" %s::C%sWrapper::%s(nMajor, nMinor, nMicro);", NameSpace, NameSpace, componentdefinition.Global.VersionMethod) w.Writeln(" std::cout << \"%s.Version = \" << nMajor << \".\" << nMinor << \".\" << nMicro << std::endl;", NameSpace); w.Writeln(" }") w.Writeln(" catch (std::exception &e)") diff --git a/Source/buildbindinggo.go b/Source/buildbindinggo.go index 861ecafd..19c3d1ca 100644 --- a/Source/buildbindinggo.go +++ b/Source/buildbindinggo.go @@ -290,7 +290,7 @@ func buildGoWrapper (component ComponentDefinition, w io.Writer, implw io.Writer fmt.Fprintf (implw, " return uintptr (value);\n"); fmt.Fprintf (implw, "}\n"); fmt.Fprintf (implw, "\n"); - fmt.Fprintf (implw, "func Uint64InValue (value uint64) uintptr {\n"); + fmt.Fprintf (implw, "func UInt64InValue (value uint64) uintptr {\n"); fmt.Fprintf (implw, " return uintptr (value);\n"); fmt.Fprintf (implw, "}\n"); fmt.Fprintf (implw, "\n"); @@ -488,19 +488,40 @@ func buildGoWrapper (component ComponentDefinition, w io.Writer, implw io.Writer fmt.Fprintf (w, "\n"); fmt.Fprintf (w, classdefinitions); - + + fmt.Fprintf (implw, "\n"); + fmt.Fprintf (implw, "func (implementation *%sImplementation) checkBinaryVersion() (error) {\n", NameSpace) + fmt.Fprintf (implw, " var nBindingMajor uint32 = %d;\n", majorVersion(component.Version)) + fmt.Fprintf (implw, " var nBindingMinor uint32 = %d;\n", minorVersion(component.Version)) + fmt.Fprintf (implw, " nMajor, nMinor, _, err := implementation.%s()\n", global.VersionMethod); + fmt.Fprintf (implw, " if (err != nil) {\n"); + fmt.Fprintf (implw, " return err;\n"); + fmt.Fprintf (implw, " }\n"); + fmt.Fprintf (implw, " if ( (nMajor != nBindingMajor) || (nMinor < nBindingMinor) ) {\n" ) + fmt.Fprintf (implw, " return fmt.Errorf (\"%s Error: %.04x (%s)\", int(0), Get%sErrorMessage (uint32(0)));", NameSpace, "%", "%s", NameSpace) + fmt.Fprintf (implw, " }\n") + fmt.Fprintf (implw, " return nil\n") + fmt.Fprintf (implw, "}\n"); + fmt.Fprintf (implw, "\n"); + fmt.Fprintf (implw, "func %sLoadWrapper (DllFileName string) (%sWrapper, error) {\n", NameSpace, NameSpace); - fmt.Fprintf (implw, " var Wrapper %sWrapper;\n", NameSpace); - fmt.Fprintf (implw, " var Instance %sImplementation;\n", NameSpace); - fmt.Fprintf (implw, " \n"); - fmt.Fprintf (implw, " err := Instance.Initialize (DllFileName);\n"); - fmt.Fprintf (implw, " if (err != nil) {\n"); - fmt.Fprintf (implw, " return Wrapper, err;\n"); - fmt.Fprintf (implw, " }\n"); - fmt.Fprintf (implw, " \n"); - fmt.Fprintf (implw, " Wrapper.Interface = &Instance;\n"); - fmt.Fprintf (implw, " \n"); - fmt.Fprintf (implw, " return Wrapper, nil;\n"); + fmt.Fprintf (implw, " var Wrapper %sWrapper;\n", NameSpace); + fmt.Fprintf (implw, " var Instance %sImplementation;\n", NameSpace); + fmt.Fprintf (implw, " \n"); + fmt.Fprintf (implw, " err := Instance.Initialize (DllFileName);\n"); + fmt.Fprintf (implw, " if (err != nil) {\n"); + fmt.Fprintf (implw, " return Wrapper, err;\n"); + fmt.Fprintf (implw, " }\n"); + + fmt.Fprintf (implw, " err = Instance.checkBinaryVersion()\n") + fmt.Fprintf (implw, " if (err != nil) {\n"); + fmt.Fprintf (implw, " return Wrapper, err;\n"); + fmt.Fprintf (implw, " }\n"); + + fmt.Fprintf (implw, " Wrapper.Interface = &Instance;\n"); + fmt.Fprintf (implw, " \n"); + + fmt.Fprintf (implw, " return Wrapper, nil;\n"); fmt.Fprintf (implw, "}\n"); fmt.Fprintf (implw, "\n"); diff --git a/Source/buildbindingpascal.go b/Source/buildbindingpascal.go index 751e68e2..b931aad8 100644 --- a/Source/buildbindingpascal.go +++ b/Source/buildbindingpascal.go @@ -75,7 +75,7 @@ func BuildBindingPascalDynamic(componentdefinition ComponentDefinition, outputFo dynpascalexamplefile.WritePascalLicenseHeader(componentdefinition, fmt.Sprintf("This is an autogenerated Pascal application that demonstrates the\n usage of the Pascal bindings of %s", libraryname), true) - err = buildDynamicPascalExample(dynpascalexamplefile, namespace, baseName, outputFolder) + err = buildDynamicPascalExample(dynpascalexamplefile, componentdefinition.Global, namespace, baseName, outputFolder) if err != nil { return err; } @@ -336,14 +336,16 @@ func buildDynamicPascalImplementation(componentdefinition ComponentDefinition, w } w.Writeln ("") - w.Writeln (" {$IFDEF MSWINDOWS}"); + w.Writeln (" {$IFDEF MSWINDOWS}"); w.Writeln (" function LoadFunction (AFunctionName: AnsiString; FailIfNotExistent: Boolean = True): FARPROC;"); - w.Writeln (" {$ELSE}"); + w.Writeln (" {$ELSE}"); w.Writeln (" function LoadFunction (AFunctionName: AnsiString; FailIfNotExistent: Boolean = True): Pointer;"); - w.Writeln (" {$ENDIF MSWINDOWS}"); + w.Writeln (" {$ENDIF MSWINDOWS}"); + w.Writeln ("") + w.Writeln (" procedure checkBinaryVersion();") w.Writeln ("") - - w.Writeln (" protected"); + + w.Writeln (" protected"); for i := 0; i < len(componentdefinition.Classes); i++ { class := componentdefinition.Classes[i] @@ -519,13 +521,14 @@ func buildDynamicPascalImplementation(componentdefinition ComponentDefinition, w w.Writeln (" F%s%sFunc := LoadFunction ('%s');", NameSpace, method.MethodName, GetCExportName (NameSpace, "Wrapper", method, true)); } - + w.Writeln (" ") + w.Writeln (" checkBinaryVersion();"); w.Writeln (" end;"); w.Writeln ("") w.Writeln (" destructor T%sWrapper.Destroy;", NameSpace); w.Writeln (" begin"); - w.Writeln (" {$IFDEF MSWINDOWS}"); - w.Writeln (" if FModule <> 0 then"); + w.Writeln (" {$IFDEF MSWINDOWS}"); + w.Writeln (" if FModule <> 0 then"); w.Writeln (" FreeLibrary (FModule);"); w.Writeln (" {$ELSE}"); w.Writeln (" if FModule <> 0 then"); @@ -552,16 +555,27 @@ func buildDynamicPascalImplementation(componentdefinition ComponentDefinition, w w.Writeln (" if FailIfNotExistent and not Assigned (Result) then"); w.Writeln (" raise E%sException.CreateCustomMessage (%s_ERROR_COULDNOTFINDLIBRARYEXPORT, 'could not find function ' + AFunctionName);", NameSpace, strings.ToUpper (NameSpace)); w.Writeln (" end;"); - w.Writeln (" {$ELSE}"); + w.Writeln (" {$ELSE}"); w.Writeln (" function T%sWrapper.LoadFunction (AFunctionName: AnsiString; FailIfNotExistent: Boolean): Pointer;", NameSpace); - w.Writeln (" begin"); + w.Writeln (" begin"); w.Writeln (" Result := dynlibs.GetProcAddress (FModule, AFunctionName);"); w.Writeln (" if FailIfNotExistent and not Assigned (Result) then"); w.Writeln (" raise E%sException.CreateCustomMessage (%s_ERROR_COULDNOTFINDLIBRARYEXPORT, 'could not find function ' + AFunctionName);", NameSpace, strings.ToUpper (NameSpace)); - w.Writeln (" end;"); - w.Writeln (" {$ENDIF MSWINDOWS}"); + w.Writeln (" end;"); + w.Writeln (" {$ENDIF MSWINDOWS}"); w.Writeln ("") + + w.Writeln (" procedure T%sWrapper.checkBinaryVersion();", NameSpace) + w.Writeln (" var") + w.Writeln (" AMajor, AMinor, AMicro: Cardinal;") + w.Writeln (" begin") + w.Writeln (" %s(AMajor, AMinor, AMicro);", global.VersionMethod) + w.Writeln (" if (AMajor <> %s_VERSION_MAJOR) or (AMinor < %s_VERSION_MINOR) then", strings.ToUpper(NameSpace), strings.ToUpper(NameSpace)) + w.Writeln (" raise E%sException.Create(%s_ERROR_INCOMPATIBLEBINARYVERSION);", NameSpace, strings.ToUpper(NameSpace)) + w.Writeln (" end;") + w.Writeln (" ") + for j := 0; j < len(global.Methods); j++ { method := global.Methods[j] @@ -1013,7 +1027,7 @@ func generatePlainPascalParameters(method ComponentDefinitionMethod, className s } -func buildDynamicPascalExample(w LanguageWriter, NameSpace string, BaseName string, outputFolder string) error { +func buildDynamicPascalExample(w LanguageWriter, global ComponentDefinitionGlobal, NameSpace string, BaseName string, outputFolder string) error { w.Writeln("program %sPascalTest;", NameSpace) w.Writeln("") w.Writeln("uses") @@ -1047,7 +1061,7 @@ func buildDynamicPascalExample(w LanguageWriter, NameSpace string, BaseName stri w.Writeln(" A%sWrapper := T%sWrapper.Create (ALibPath + '/' + '%s.dll');", NameSpace, NameSpace, BaseName) w.Writeln(" try") w.Writeln(" writeln ('loading DLL Done');") - w.Writeln(" A%sWrapper.GetLibraryVersion(AMajor, AMinor, AMicro);", NameSpace) + w.Writeln(" A%sWrapper.%s(AMajor, AMinor, AMicro);", NameSpace, global.VersionMethod) w.Writeln(" writeln (Format('%s.version = %s', [AMajor, AMinor, AMicro]));",NameSpace, "%d.%d.%d") w.Writeln(" finally") w.Writeln(" FreeAndNil(A%sWrapper);", NameSpace) diff --git a/Source/buildbindingpython.go b/Source/buildbindingpython.go index bada1ad6..3de4773c 100644 --- a/Source/buildbindingpython.go +++ b/Source/buildbindingpython.go @@ -109,6 +109,15 @@ func buildDynamicPythonImplementation(componentdefinition ComponentDefinition, w w.Writeln(" return '%sException ' + str(self._code)", NameSpace) w.Writeln("") + + w.Writeln("'''Definition of binding API version") + w.Writeln("'''") + w.Writeln("class %sBindingVersion(enum.IntEnum):", NameSpace) + w.Writeln(" MAJOR = %d", majorVersion(componentdefinition.Version)) + w.Writeln(" MINOR = %d", minorVersion(componentdefinition.Version)) + w.Writeln(" MICRO = %d", microVersion(componentdefinition.Version)) + w.Writeln("") + w.Writeln("'''Definition Error Codes") w.Writeln("'''") w.Writeln("class %sErrorCodes(enum.IntEnum):", NameSpace) @@ -234,6 +243,8 @@ func buildDynamicPythonImplementation(componentdefinition ComponentDefinition, w w.Writeln(" raise E%sException(%sErrorCodes.COULDNOTLOADLIBRARY, str(e) + '| \"'+path + '\"' )", NameSpace, NameSpace ) w.Writeln(" ") w.Writeln(" self._loadFunctionTable()") + w.Writeln(" ") + w.Writeln(" self._checkBinaryVersion()") w.Writeln(" ") w.Writeln(" def _loadFunctionTable(self):") @@ -245,6 +256,13 @@ func buildDynamicPythonImplementation(componentdefinition ComponentDefinition, w w.Writeln(" except AttributeError as ae:") w.Writeln(" raise E%sException(%sErrorCodes.COULDNOTFINDLIBRARYEXPORT, ae.args[0])", NameSpace, NameSpace) w.Writeln(" ") + + w.Writeln(" def _checkBinaryVersion(self):") + w.Writeln(" nMajor, nMinor, _ = self.%s()", componentdefinition.Global.VersionMethod) + w.Writeln(" if (nMajor != %sBindingVersion.MAJOR) or (nMinor < %sBindingVersion.MINOR):", NameSpace, NameSpace) + w.Writeln(" raise E%sException(%sErrorCodes.INCOMPATIBLEBINARYVERSION)", NameSpace, NameSpace) + w.Writeln(" ") + w.Writeln(" def checkError(self, instance, errorCode):") w.Writeln(" if instance:") w.Writeln(" if instance._wrapper != self:") From c754f24535056ff32008ac6099a4f40e4e23ba25 Mon Sep 17 00:00:00 2001 From: Martin Weismann Date: Thu, 13 Dec 2018 13:26:41 +0100 Subject: [PATCH 02/22] Update LibPrimes Example to v1.3.2 --- .../Bindings/CDynamic/libprimes_dynamic.cpp | 193 -------- .../Bindings/CDynamic/libprimes_dynamic.h | 176 ------- .../Bindings/CDynamic/libprimes_types.h | 117 ----- .../Bindings/Cpp/libprimes.cpp | 80 ++-- .../Bindings/Cpp/libprimes.h | 59 +-- .../Bindings/Cpp/libprimes.hpp | 51 +- .../Bindings/Cpp/libprimes_types.h | 10 +- .../Bindings/CppDynamic/libprimes_dynamic.h | 66 ++- .../Bindings/CppDynamic/libprimes_dynamic.hpp | 131 +++-- .../Bindings/CppDynamic/libprimes_types.h | 10 +- .../Bindings/Pascal/Unit_LibPrimes.pas | 150 +++--- .../Bindings/Python/LibPrimes.py | 68 ++- .../Examples/CPP/CMakeLists.txt | 14 +- .../Examples/CPP/LibPrimes_example.cpp | 8 +- .../Examples/CppDynamic/LibPrimes_example.cpp | 5 - .../Examples/Python/LibPrimes_Example.py | 14 +- .../Implementations/Cpp/CMakeLists.txt | 15 +- .../Cpp/Interfaces}/libprimes.h | 59 +-- .../libprimes_interfaceexception.cpp | 39 ++ .../libprimes_interfaceexception.hpp | 55 +++ .../Interfaces/libprimes_interfacejournal.cpp | 312 ++++++++++++ .../Interfaces/libprimes_interfacejournal.hpp | 120 +++++ .../Cpp/Interfaces/libprimes_interfaces.hpp | 152 ++++++ .../Interfaces/libprimes_interfacewrapper.cpp | 447 ++++++++++++++++++ .../Cpp/Interfaces}/libprimes_types.h | 10 +- .../Implementations/Cpp/Stub/libprimes.cpp | 1 - .../libprimes_factorizationcalculator.cpp | 9 +- .../libprimes_factorizationcalculator.hpp | 2 - .../Pascal/Interfaces/libprimes.lpr | 15 +- .../Pascal/Interfaces/libprimes_exception.pas | 11 +- .../Pascal/Interfaces/libprimes_exports.pas | 159 +++---- .../Interfaces/libprimes_interfaces.pas | 11 +- .../Pascal/Interfaces/libprimes_types.pas | 19 +- ...libprimes_impl_factorizationcalculator.pas | 6 - .../Implementations/Pascal/libprimes.def | 12 + .../Primes/LibPrimes_component/license.txt | 5 + Examples/Primes/Tutorial.md | 113 ++--- Examples/Primes/libPrimes.xml | 46 +- Examples/Primes/ressources/310/libPrimes.xml | 42 ++ Examples/Primes/ressources/315/libPrimes.xml | 30 +- Examples/Primes/ressources/510/libPrimes.xml | 42 +- Examples/Primes/ressources/610/libPrimes.xml | 44 +- 42 files changed, 1719 insertions(+), 1209 deletions(-) delete mode 100644 Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_dynamic.cpp delete mode 100644 Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_dynamic.h delete mode 100644 Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_types.h rename Examples/Primes/LibPrimes_component/{Bindings/C => Implementations/Cpp/Interfaces}/libprimes.h (86%) create mode 100644 Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.cpp create mode 100644 Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.hpp create mode 100644 Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacejournal.cpp create mode 100644 Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacejournal.hpp create mode 100644 Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaces.hpp create mode 100644 Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacewrapper.cpp rename Examples/Primes/LibPrimes_component/{Bindings/C => Implementations/Cpp/Interfaces}/libprimes_types.h (95%) create mode 100644 Examples/Primes/LibPrimes_component/Implementations/Pascal/libprimes.def create mode 100644 Examples/Primes/LibPrimes_component/license.txt create mode 100644 Examples/Primes/ressources/310/libPrimes.xml diff --git a/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_dynamic.cpp b/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_dynamic.cpp deleted file mode 100644 index e29aa9d6..00000000 --- a/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_dynamic.cpp +++ /dev/null @@ -1,193 +0,0 @@ -/*++ - -Copyright (C) 2018 Automatic Component Toolkit Developers - -All rights reserved. - -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. - -Abstract: This is an autogenerated plain C Header file in order to allow an easy - use of Prime Numbers Interface - -Interface version: 1.3.0 - -*/ - -#include "libprimes_types.h" -#include "libprimes_dynamic.h" -#ifdef WIN32 -#include -#else // WIN32 -#include -#endif // WIN32 - -LibPrimesResult InitLibPrimesWrapperTable (sLibPrimesDynamicWrapperTable * pWrapperTable) -{ - if (pWrapperTable == nullptr) - return LIBPRIMES_ERROR_INVALIDPARAM; - - pWrapperTable->m_LibraryHandle = nullptr; - pWrapperTable->m_Calculator_GetValue = nullptr; - pWrapperTable->m_Calculator_SetValue = nullptr; - pWrapperTable->m_Calculator_SetProgressCallback = nullptr; - pWrapperTable->m_Calculator_Calculate = nullptr; - pWrapperTable->m_FactorizationCalculator_GetPrimeFactors = nullptr; - pWrapperTable->m_FactorizationCalculator_CheckPrimeFactors = nullptr; - pWrapperTable->m_SieveCalculator_GetPrimes = nullptr; - pWrapperTable->m_CreateFactorizationCalculator = nullptr; - pWrapperTable->m_CreateSieveCalculator = nullptr; - pWrapperTable->m_ReleaseInstance = nullptr; - pWrapperTable->m_GetLibraryVersion = nullptr; - pWrapperTable->m_SetJournal = nullptr; - - return LIBPRIMES_SUCCESS; -} - -LibPrimesResult ReleaseLibPrimesWrapperTable (sLibPrimesDynamicWrapperTable * pWrapperTable) -{ - if (pWrapperTable == nullptr) - return LIBPRIMES_ERROR_INVALIDPARAM; - - if (pWrapperTable->m_LibraryHandle != nullptr) { - #ifdef WIN32 - HMODULE hModule = (HMODULE) pWrapperTable->m_LibraryHandle; - FreeLibrary (hModule); - #else // WIN32 - dlclose (pWrapperTable->m_LibraryHandle); - #endif // WIN32 - return InitLibPrimesWrapperTable (pWrapperTable); - } - - return LIBPRIMES_SUCCESS; -} - -LibPrimesResult LoadLibPrimesWrapperTable (sLibPrimesDynamicWrapperTable * pWrapperTable, const char * pLibraryFileName) -{ - if (pWrapperTable == nullptr) - return LIBPRIMES_ERROR_INVALIDPARAM; - if (pLibraryFileName == nullptr) - return LIBPRIMES_ERROR_INVALIDPARAM; - - #ifdef WIN32 - HMODULE hLibrary = LoadLibraryA (pLibraryFileName); - if (hLibrary == 0) - return LIBPRIMES_ERROR_COULDNOTLOADLIBRARY; - #else // WIN32 - void* hLibrary = dlopen (pLibraryFileName, RTLD_LAZY); - if (hLibrary == 0) - return LIBPRIMES_ERROR_COULDNOTLOADLIBRARY; - dlerror(); - #endif // WIN32 - - #ifdef WIN32 - pWrapperTable->m_Calculator_GetValue = (PLibPrimesCalculator_GetValuePtr) GetProcAddress (hLibrary, "libprimes_calculator_getvalue"); - #else // WIN32 - pWrapperTable->m_Calculator_GetValue = (PLibPrimesCalculator_GetValuePtr) dlsym (hLibrary, "libprimes_calculator_getvalue"); - dlerror(); - #endif // WIN32 - if (pWrapperTable->m_Calculator_GetValue == nullptr) - return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; - - #ifdef WIN32 - pWrapperTable->m_Calculator_SetValue = (PLibPrimesCalculator_SetValuePtr) GetProcAddress (hLibrary, "libprimes_calculator_setvalue"); - #else // WIN32 - pWrapperTable->m_Calculator_SetValue = (PLibPrimesCalculator_SetValuePtr) dlsym (hLibrary, "libprimes_calculator_setvalue"); - dlerror(); - #endif // WIN32 - if (pWrapperTable->m_Calculator_SetValue == nullptr) - return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; - - #ifdef WIN32 - pWrapperTable->m_Calculator_SetProgressCallback = (PLibPrimesCalculator_SetProgressCallbackPtr) GetProcAddress (hLibrary, "libprimes_calculator_setprogresscallback"); - #else // WIN32 - pWrapperTable->m_Calculator_SetProgressCallback = (PLibPrimesCalculator_SetProgressCallbackPtr) dlsym (hLibrary, "libprimes_calculator_setprogresscallback"); - dlerror(); - #endif // WIN32 - if (pWrapperTable->m_Calculator_SetProgressCallback == nullptr) - return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; - - #ifdef WIN32 - pWrapperTable->m_Calculator_Calculate = (PLibPrimesCalculator_CalculatePtr) GetProcAddress (hLibrary, "libprimes_calculator_calculate"); - #else // WIN32 - pWrapperTable->m_Calculator_Calculate = (PLibPrimesCalculator_CalculatePtr) dlsym (hLibrary, "libprimes_calculator_calculate"); - dlerror(); - #endif // WIN32 - if (pWrapperTable->m_Calculator_Calculate == nullptr) - return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; - - #ifdef WIN32 - pWrapperTable->m_FactorizationCalculator_GetPrimeFactors = (PLibPrimesFactorizationCalculator_GetPrimeFactorsPtr) GetProcAddress (hLibrary, "libprimes_factorizationcalculator_getprimefactors"); - #else // WIN32 - pWrapperTable->m_FactorizationCalculator_GetPrimeFactors = (PLibPrimesFactorizationCalculator_GetPrimeFactorsPtr) dlsym (hLibrary, "libprimes_factorizationcalculator_getprimefactors"); - dlerror(); - #endif // WIN32 - if (pWrapperTable->m_FactorizationCalculator_GetPrimeFactors == nullptr) - return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; - - #ifdef WIN32 - pWrapperTable->m_FactorizationCalculator_CheckPrimeFactors = (PLibPrimesFactorizationCalculator_CheckPrimeFactorsPtr) GetProcAddress (hLibrary, "libprimes_factorizationcalculator_checkprimefactors"); - #else // WIN32 - pWrapperTable->m_FactorizationCalculator_CheckPrimeFactors = (PLibPrimesFactorizationCalculator_CheckPrimeFactorsPtr) dlsym (hLibrary, "libprimes_factorizationcalculator_checkprimefactors"); - dlerror(); - #endif // WIN32 - if (pWrapperTable->m_FactorizationCalculator_CheckPrimeFactors == nullptr) - return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; - - #ifdef WIN32 - pWrapperTable->m_SieveCalculator_GetPrimes = (PLibPrimesSieveCalculator_GetPrimesPtr) GetProcAddress (hLibrary, "libprimes_sievecalculator_getprimes"); - #else // WIN32 - pWrapperTable->m_SieveCalculator_GetPrimes = (PLibPrimesSieveCalculator_GetPrimesPtr) dlsym (hLibrary, "libprimes_sievecalculator_getprimes"); - dlerror(); - #endif // WIN32 - if (pWrapperTable->m_SieveCalculator_GetPrimes == nullptr) - return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; - - #ifdef WIN32 - pWrapperTable->m_CreateFactorizationCalculator = (PLibPrimesCreateFactorizationCalculatorPtr) GetProcAddress (hLibrary, "libprimes_createfactorizationcalculator"); - #else // WIN32 - pWrapperTable->m_CreateFactorizationCalculator = (PLibPrimesCreateFactorizationCalculatorPtr) dlsym (hLibrary, "libprimes_createfactorizationcalculator"); - dlerror(); - #endif // WIN32 - if (pWrapperTable->m_CreateFactorizationCalculator == nullptr) - return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; - - #ifdef WIN32 - pWrapperTable->m_CreateSieveCalculator = (PLibPrimesCreateSieveCalculatorPtr) GetProcAddress (hLibrary, "libprimes_createsievecalculator"); - #else // WIN32 - pWrapperTable->m_CreateSieveCalculator = (PLibPrimesCreateSieveCalculatorPtr) dlsym (hLibrary, "libprimes_createsievecalculator"); - dlerror(); - #endif // WIN32 - if (pWrapperTable->m_CreateSieveCalculator == nullptr) - return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; - - #ifdef WIN32 - pWrapperTable->m_ReleaseInstance = (PLibPrimesReleaseInstancePtr) GetProcAddress (hLibrary, "libprimes_releaseinstance"); - #else // WIN32 - pWrapperTable->m_ReleaseInstance = (PLibPrimesReleaseInstancePtr) dlsym (hLibrary, "libprimes_releaseinstance"); - dlerror(); - #endif // WIN32 - if (pWrapperTable->m_ReleaseInstance == nullptr) - return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; - - #ifdef WIN32 - pWrapperTable->m_GetLibraryVersion = (PLibPrimesGetLibraryVersionPtr) GetProcAddress (hLibrary, "libprimes_getlibraryversion"); - #else // WIN32 - pWrapperTable->m_GetLibraryVersion = (PLibPrimesGetLibraryVersionPtr) dlsym (hLibrary, "libprimes_getlibraryversion"); - dlerror(); - #endif // WIN32 - if (pWrapperTable->m_GetLibraryVersion == nullptr) - return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; - - #ifdef WIN32 - pWrapperTable->m_SetJournal = (PLibPrimesSetJournalPtr) GetProcAddress (hLibrary, "libprimes_setjournal"); - #else // WIN32 - pWrapperTable->m_SetJournal = (PLibPrimesSetJournalPtr) dlsym (hLibrary, "libprimes_setjournal"); - dlerror(); - #endif // WIN32 - if (pWrapperTable->m_SetJournal == nullptr) - return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; - - pWrapperTable->m_LibraryHandle = hLibrary; - return LIBPRIMES_SUCCESS; -} - diff --git a/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_dynamic.h b/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_dynamic.h deleted file mode 100644 index 87d0e523..00000000 --- a/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_dynamic.h +++ /dev/null @@ -1,176 +0,0 @@ -/*++ - -Copyright (C) 2018 Automatic Component Toolkit Developers - -All rights reserved. - -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. - -Abstract: This is an autogenerated plain C Header file in order to allow an easy - use of Prime Numbers Interface - -Interface version: 1.3.0 - -*/ - -#ifndef __LIBPRIMES_DYNAMICHEADER -#define __LIBPRIMES_DYNAMICHEADER - -#include "libprimes_types.h" - - -/************************************************************************************************************************* - Class definition for Calculator -**************************************************************************************************************************/ - -/** -* Returns the current value of this Calculator -* -* @param[in] pCalculator - Calculator instance. -* @param[out] pValue - The current value of this Calculator -* @return error code or 0 (success) -*/ -typedef LibPrimesResult (*PLibPrimesCalculator_GetValuePtr) (LibPrimes_Calculator pCalculator, LibPrimes_uint64 * pValue); - -/** -* Sets the value to be factorized -* -* @param[in] pCalculator - Calculator instance. -* @param[in] nValue - The value to be factorized -* @return error code or 0 (success) -*/ -typedef LibPrimesResult (*PLibPrimesCalculator_SetValuePtr) (LibPrimes_Calculator pCalculator, LibPrimes_uint64 nValue); - -/** -* Sets the progress callback function -* -* @param[in] pCalculator - Calculator instance. -* @param[in] pProgressCallback - The progress callback -* @return error code or 0 (success) -*/ -typedef LibPrimesResult (*PLibPrimesCalculator_SetProgressCallbackPtr) (LibPrimes_Calculator pCalculator, LibPrimesProgressCallback pProgressCallback); - -/** -* Performs the specific calculation of this Calculator -* -* @param[in] pCalculator - Calculator instance. -* @return error code or 0 (success) -*/ -typedef LibPrimesResult (*PLibPrimesCalculator_CalculatePtr) (LibPrimes_Calculator pCalculator); - -/************************************************************************************************************************* - Class definition for FactorizationCalculator -**************************************************************************************************************************/ - -/** -* Returns the prime factors of this number (with multiplicity) -* -* @param[in] pFactorizationCalculator - FactorizationCalculator instance. -* @param[in] nPrimeFactorsBufferSize - Number of elements in buffer -* @param[out] pPrimeFactorsNeededCount - will be filled with the count of the written elements, or needed buffer size. -* @param[out] pPrimeFactorsBuffer - PrimeFactor buffer of The prime factors of this number -* @return error code or 0 (success) -*/ -typedef LibPrimesResult (*PLibPrimesFactorizationCalculator_GetPrimeFactorsPtr) (LibPrimes_FactorizationCalculator pFactorizationCalculator, const LibPrimes_uint64 nPrimeFactorsBufferSize, LibPrimes_uint64* pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer); - -/** -* Checks, whether a list of prime factors (with multiplicity) is the prime factor decomposistion of the calculator's value -* -* @param[in] pFactorizationCalculator - FactorizationCalculator instance. -* @param[in] nPrimeFactorsBufferSize - Number of elements in buffer -* @param[in] pPrimeFactorsBuffer - PrimeFactor buffer of -* @param[out] pAreEqual - Do the prime factors decompose this calculator's value -* @return error code or 0 (success) -*/ -typedef LibPrimesResult (*PLibPrimesFactorizationCalculator_CheckPrimeFactorsPtr) (LibPrimes_FactorizationCalculator pFactorizationCalculator, LibPrimes_uint64 nPrimeFactorsBufferSize, const sLibPrimesPrimeFactor * pPrimeFactorsBuffer, bool * pAreEqual); - -/************************************************************************************************************************* - Class definition for SieveCalculator -**************************************************************************************************************************/ - -/** -* Returns all prime numbers lower or equal to the sieve's value -* -* @param[in] pSieveCalculator - SieveCalculator instance. -* @param[in] nPrimesBufferSize - Number of elements in buffer -* @param[out] pPrimesNeededCount - will be filled with the count of the written elements, or needed buffer size. -* @param[out] pPrimesBuffer - uint64 buffer of The primes lower or equal to the sieve's value -* @return error code or 0 (success) -*/ -typedef LibPrimesResult (*PLibPrimesSieveCalculator_GetPrimesPtr) (LibPrimes_SieveCalculator pSieveCalculator, const LibPrimes_uint64 nPrimesBufferSize, LibPrimes_uint64* pPrimesNeededCount, LibPrimes_uint64 * pPrimesBuffer); - -/************************************************************************************************************************* - Global functions -**************************************************************************************************************************/ - -/** -* Creates a new FactorizationCalculator instance -* -* @param[out] pInstance - New FactorizationCalculator instance -* @return error code or 0 (success) -*/ -typedef LibPrimesResult (*PLibPrimesCreateFactorizationCalculatorPtr) (LibPrimes_FactorizationCalculator * pInstance); - -/** -* Creates a new SieveCalculator instance -* -* @param[out] pInstance - New SieveCalculator instance -* @return error code or 0 (success) -*/ -typedef LibPrimesResult (*PLibPrimesCreateSieveCalculatorPtr) (LibPrimes_SieveCalculator * pInstance); - -/** -* Releases the memory of an Instance -* -* @param[in] pInstance - Instance Handle -* @return error code or 0 (success) -*/ -typedef LibPrimesResult (*PLibPrimesReleaseInstancePtr) (LibPrimes_BaseClass pInstance); - -/** -* retrieves the current version of the library. -* -* @param[out] pMajor - returns the major version of the library -* @param[out] pMinor - returns the minor version of the library -* @param[out] pMicro - returns the micro version of the library -* @return error code or 0 (success) -*/ -typedef LibPrimesResult (*PLibPrimesGetLibraryVersionPtr) (LibPrimes_uint32 * pMajor, LibPrimes_uint32 * pMinor, LibPrimes_uint32 * pMicro); - -/** -* Handles Library Journaling -* -* @param[in] pFileName - Journal FileName -* @return error code or 0 (success) -*/ -typedef LibPrimesResult (*PLibPrimesSetJournalPtr) (const char * pFileName); - -/************************************************************************************************************************* - Function Table Structure -**************************************************************************************************************************/ - -typedef struct { - void * m_LibraryHandle; - PLibPrimesCalculator_GetValuePtr m_Calculator_GetValue; - PLibPrimesCalculator_SetValuePtr m_Calculator_SetValue; - PLibPrimesCalculator_SetProgressCallbackPtr m_Calculator_SetProgressCallback; - PLibPrimesCalculator_CalculatePtr m_Calculator_Calculate; - PLibPrimesFactorizationCalculator_GetPrimeFactorsPtr m_FactorizationCalculator_GetPrimeFactors; - PLibPrimesFactorizationCalculator_CheckPrimeFactorsPtr m_FactorizationCalculator_CheckPrimeFactors; - PLibPrimesSieveCalculator_GetPrimesPtr m_SieveCalculator_GetPrimes; - PLibPrimesCreateFactorizationCalculatorPtr m_CreateFactorizationCalculator; - PLibPrimesCreateSieveCalculatorPtr m_CreateSieveCalculator; - PLibPrimesReleaseInstancePtr m_ReleaseInstance; - PLibPrimesGetLibraryVersionPtr m_GetLibraryVersion; - PLibPrimesSetJournalPtr m_SetJournal; -} sLibPrimesDynamicWrapperTable; - -/************************************************************************************************************************* - Load DLL dynamically -**************************************************************************************************************************/ -LibPrimesResult InitLibPrimesWrapperTable (sLibPrimesDynamicWrapperTable * pWrapperTable); -LibPrimesResult ReleaseLibPrimesWrapperTable (sLibPrimesDynamicWrapperTable * pWrapperTable); -LibPrimesResult LoadLibPrimesWrapperTable (sLibPrimesDynamicWrapperTable * pWrapperTable, const char * pLibraryFileName); - -#endif // __LIBPRIMES_DYNAMICHEADER - diff --git a/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_types.h b/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_types.h deleted file mode 100644 index 1eb111f0..00000000 --- a/Examples/Primes/LibPrimes_component/Bindings/CDynamic/libprimes_types.h +++ /dev/null @@ -1,117 +0,0 @@ -/*++ - -Copyright (C) 2018 Automatic Component Toolkit Developers - -All rights reserved. - -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. - -Abstract: This is an autogenerated plain C Header file with basic types in -order to allow an easy use of Prime Numbers Interface - -Interface version: 1.3.0 - -*/ - -#ifndef __LIBPRIMES_TYPES_HEADER -#define __LIBPRIMES_TYPES_HEADER - -/************************************************************************************************************************* - Scalar types definition -**************************************************************************************************************************/ - -#ifdef LIBPRIMES_USELEGACYINTEGERTYPES - -typedef unsigned char LibPrimes_uint8; -typedef unsigned short LibPrimes_uint16 ; -typedef unsigned int LibPrimes_uint32; -typedef unsigned long long LibPrimes_uint64; -typedef char LibPrimes_int8; -typedef short LibPrimes_int16; -typedef int LibPrimes_int32; -typedef long long LibPrimes_int64; - -#else // LIBPRIMES_USELEGACYINTEGERTYPES - -#include - -typedef uint8_t LibPrimes_uint8; -typedef uint16_t LibPrimes_uint16; -typedef uint32_t LibPrimes_uint32; -typedef uint64_t LibPrimes_uint64; -typedef int8_t LibPrimes_int8; -typedef int16_t LibPrimes_int16; -typedef int32_t LibPrimes_int32; -typedef int64_t LibPrimes_int64 ; - -#endif // LIBPRIMES_USELEGACYINTEGERTYPES - -typedef float LibPrimes_single; -typedef double LibPrimes_double; - -/************************************************************************************************************************* - General type definitions -**************************************************************************************************************************/ - -typedef LibPrimes_int32 LibPrimesResult; -typedef void * LibPrimesHandle; - -/************************************************************************************************************************* - Version for LibPrimes -**************************************************************************************************************************/ - -#define LIBPRIMES_VERSION_MAJOR 1 -#define LIBPRIMES_VERSION_MINOR 3 -#define LIBPRIMES_VERSION_MICRO 0 - -/************************************************************************************************************************* - Error constants for LibPrimes -**************************************************************************************************************************/ - -#define LIBPRIMES_SUCCESS 0 -#define LIBPRIMES_ERROR_NOTIMPLEMENTED 1 -#define LIBPRIMES_ERROR_INVALIDPARAM 2 -#define LIBPRIMES_ERROR_INVALIDCAST 3 -#define LIBPRIMES_ERROR_BUFFERTOOSMALL 4 -#define LIBPRIMES_ERROR_GENERICEXCEPTION 5 -#define LIBPRIMES_ERROR_COULDNOTLOADLIBRARY 6 -#define LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT 7 -#define LIBPRIMES_ERROR_INCOMPATIBLEBINARYVERSION 8 -#define LIBPRIMES_ERROR_NORESULTAVAILABLE 9 -#define LIBPRIMES_ERROR_CALCULATIONABORTED 10 - -/************************************************************************************************************************* - Declaration of handle classes -**************************************************************************************************************************/ - -typedef LibPrimesHandle LibPrimes_BaseClass; -typedef LibPrimesHandle LibPrimes_Calculator; -typedef LibPrimesHandle LibPrimes_FactorizationCalculator; -typedef LibPrimesHandle LibPrimes_SieveCalculator; - -/************************************************************************************************************************* - Declaration of structs -**************************************************************************************************************************/ - -#pragma pack (1) - -typedef struct { - LibPrimes_uint64 m_Prime; - LibPrimes_uint32 m_Multiplicity; -} sLibPrimesPrimeFactor; - -#pragma pack () - -/************************************************************************************************************************* - Declaration of function pointers -**************************************************************************************************************************/ - -/** -* LibPrimesProgressCallback - Callback to report calculation progress and query whether it should be aborted -* -* @param[in] fProgressPercentage - How far has the calculation progressed? -* @param[out] pShouldAbort - Should the calculation be aborted? -*/ -typedef void(*LibPrimesProgressCallback)(LibPrimes_single, bool*); - -#endif // __LIBPRIMES_TYPES_HEADER diff --git a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.cpp b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.cpp index baafb002..86949f4e 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.cpp +++ b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.cpp @@ -1,15 +1,15 @@ /*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. Abstract: This is an autogenerated C++ Wrapper Implementation file in order to allow -an easy use of Prime Numbers Interface +an easy use of Prime Numbers Library -Interface version: 1.3.0 +Interface version: 1.2.0 */ @@ -94,20 +94,20 @@ void CLibPrimesCalculator::SetValue (const LibPrimes_uint64 nValue) } /** -* CLibPrimesCalculator::SetProgressCallback - Sets the progress callback function -* @param[in] pProgressCallback - The progress callback +* CLibPrimesCalculator::Calculate - Performs the specific calculation of this Calculator */ -void CLibPrimesCalculator::SetProgressCallback (const LibPrimesProgressCallback pProgressCallback) +void CLibPrimesCalculator::Calculate () { - CheckError ( libprimes_calculator_setprogresscallback (m_pHandle, pProgressCallback) ); + CheckError ( libprimes_calculator_calculate (m_pHandle) ); } /** -* CLibPrimesCalculator::Calculate - Performs the specific calculation of this Calculator +* CLibPrimesCalculator::SetProgressCallback - Sets the progress callback function +* @param[in] pProgressCallback - The progress callback */ -void CLibPrimesCalculator::Calculate () +void CLibPrimesCalculator::SetProgressCallback (const LibPrimesProgressCallback pProgressCallback) { - CheckError ( libprimes_calculator_calculate (m_pHandle) ); + CheckError ( libprimes_calculator_setprogresscallback (m_pHandle, pProgressCallback) ); } /************************************************************************************************************************* @@ -121,7 +121,7 @@ CLibPrimesFactorizationCalculator::CLibPrimesFactorizationCalculator (LibPrimesH { } /** -* CLibPrimesFactorizationCalculator::GetPrimeFactors - Returns the prime factors of this number (with multiplicity) +* CLibPrimesFactorizationCalculator::GetPrimeFactors - Returns the prime factors of this number (without multiplicity) * @param[out] PrimeFactorsBuffer - The prime factors of this number */ void CLibPrimesFactorizationCalculator::GetPrimeFactors (std::vector & PrimeFactorsBuffer) @@ -132,18 +132,6 @@ void CLibPrimesFactorizationCalculator::GetPrimeFactors (std::vector & PrimeFactorsBuffer) -{ - bool resultAreEqual = 0; - CheckError ( libprimes_factorizationcalculator_checkprimefactors (m_pHandle, (LibPrimes_uint64)PrimeFactorsBuffer.size(), PrimeFactorsBuffer.data(), &resultAreEqual) ); - return resultAreEqual; -} /************************************************************************************************************************* Class CLibPrimesSieveCalculator @@ -168,28 +156,6 @@ void CLibPrimesSieveCalculator::GetPrimes (std::vector & Prime CheckError ( libprimes_sievecalculator_getprimes (m_pHandle, elementsNeededPrimes, &elementsWrittenPrimes, PrimesBuffer.data()) ); } -/** -* CLibPrimesWrapper::CreateFactorizationCalculator - Creates a new FactorizationCalculator instance -* @return New FactorizationCalculator instance -*/ -PLibPrimesFactorizationCalculator CLibPrimesWrapper::CreateFactorizationCalculator () -{ - LibPrimesHandle hInstance = nullptr; - CheckError (nullptr, libprimes_createfactorizationcalculator (&hInstance) ); - return std::make_shared (hInstance); -} - -/** -* CLibPrimesWrapper::CreateSieveCalculator - Creates a new SieveCalculator instance -* @return New SieveCalculator instance -*/ -PLibPrimesSieveCalculator CLibPrimesWrapper::CreateSieveCalculator () -{ - LibPrimesHandle hInstance = nullptr; - CheckError (nullptr, libprimes_createsievecalculator (&hInstance) ); - return std::make_shared (hInstance); -} - /** * CLibPrimesWrapper::ReleaseInstance - Releases the memory of an Instance * @param[in] pInstance - Instance Handle @@ -214,6 +180,28 @@ void CLibPrimesWrapper::GetLibraryVersion (LibPrimes_uint32 & nMajor, LibPrimes_ CheckError (nullptr, libprimes_getlibraryversion (&nMajor, &nMinor, &nMicro) ); } +/** +* CLibPrimesWrapper::CreateFactorizationCalculator - Creates a new FactorizationCalculator instance +* @return New FactorizationCalculator instance +*/ +PLibPrimesFactorizationCalculator CLibPrimesWrapper::CreateFactorizationCalculator () +{ + LibPrimesHandle hInstance = nullptr; + CheckError (nullptr, libprimes_createfactorizationcalculator (&hInstance) ); + return std::make_shared (hInstance); +} + +/** +* CLibPrimesWrapper::CreateSieveCalculator - Creates a new SieveCalculator instance +* @return New SieveCalculator instance +*/ +PLibPrimesSieveCalculator CLibPrimesWrapper::CreateSieveCalculator () +{ + LibPrimesHandle hInstance = nullptr; + CheckError (nullptr, libprimes_createsievecalculator (&hInstance) ); + return std::make_shared (hInstance); +} + /** * CLibPrimesWrapper::SetJournal - Handles Library Journaling * @param[in] sFileName - Journal FileName diff --git a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.h b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.h index 175bce9e..08f6956b 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.h +++ b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.h @@ -1,15 +1,15 @@ /*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. Abstract: This is an autogenerated plain C Header file in order to allow an easy - use of Prime Numbers Interface + use of Prime Numbers Library -Interface version: 1.3.0 +Interface version: 1.2.0 */ @@ -53,28 +53,28 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_getvalue(LibPrimes_Calcu LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_setvalue(LibPrimes_Calculator pCalculator, LibPrimes_uint64 nValue); /** -* Sets the progress callback function +* Performs the specific calculation of this Calculator * * @param[in] pCalculator - Calculator instance. -* @param[in] pProgressCallback - The progress callback * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_setprogresscallback(LibPrimes_Calculator pCalculator, LibPrimesProgressCallback pProgressCallback); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_calculate(LibPrimes_Calculator pCalculator); /** -* Performs the specific calculation of this Calculator +* Sets the progress callback function * * @param[in] pCalculator - Calculator instance. +* @param[in] pProgressCallback - The progress callback * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_calculate(LibPrimes_Calculator pCalculator); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_setprogresscallback(LibPrimes_Calculator pCalculator, LibPrimesProgressCallback pProgressCallback); /************************************************************************************************************************* Class definition for FactorizationCalculator **************************************************************************************************************************/ /** -* Returns the prime factors of this number (with multiplicity) +* Returns the prime factors of this number (without multiplicity) * * @param[in] pFactorizationCalculator - FactorizationCalculator instance. * @param[in] nPrimeFactorsBufferSize - Number of elements in buffer @@ -84,17 +84,6 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_calculate(LibPrimes_Calc */ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_factorizationcalculator_getprimefactors(LibPrimes_FactorizationCalculator pFactorizationCalculator, const LibPrimes_uint64 nPrimeFactorsBufferSize, LibPrimes_uint64* pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer); -/** -* Checks, whether a list of prime factors (with multiplicity) is the prime factor decomposistion of the calculator's value -* -* @param[in] pFactorizationCalculator - FactorizationCalculator instance. -* @param[in] nPrimeFactorsBufferSize - Number of elements in buffer -* @param[in] pPrimeFactorsBuffer - PrimeFactor buffer of -* @param[out] pAreEqual - Do the prime factors decompose this calculator's value -* @return error code or 0 (success) -*/ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_factorizationcalculator_checkprimefactors(LibPrimes_FactorizationCalculator pFactorizationCalculator, LibPrimes_uint64 nPrimeFactorsBufferSize, const sLibPrimesPrimeFactor * pPrimeFactorsBuffer, bool * pAreEqual); - /************************************************************************************************************************* Class definition for SieveCalculator **************************************************************************************************************************/ @@ -115,38 +104,38 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_sievecalculator_getprimes(LibPrimes **************************************************************************************************************************/ /** -* Creates a new FactorizationCalculator instance +* Releases the memory of an Instance * -* @param[out] pInstance - New FactorizationCalculator instance +* @param[in] pInstance - Instance Handle * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_createfactorizationcalculator(LibPrimes_FactorizationCalculator * pInstance); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_releaseinstance(LibPrimes_BaseClass pInstance); /** -* Creates a new SieveCalculator instance +* retrieves the current version of the library. * -* @param[out] pInstance - New SieveCalculator instance +* @param[out] pMajor - returns the major version of the library +* @param[out] pMinor - returns the minor version of the library +* @param[out] pMicro - returns the micro version of the library * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_createsievecalculator(LibPrimes_SieveCalculator * pInstance); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_getlibraryversion(LibPrimes_uint32 * pMajor, LibPrimes_uint32 * pMinor, LibPrimes_uint32 * pMicro); /** -* Releases the memory of an Instance +* Creates a new FactorizationCalculator instance * -* @param[in] pInstance - Instance Handle +* @param[out] pInstance - New FactorizationCalculator instance * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_releaseinstance(LibPrimes_BaseClass pInstance); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_createfactorizationcalculator(LibPrimes_FactorizationCalculator * pInstance); /** -* retrieves the current version of the library. +* Creates a new SieveCalculator instance * -* @param[out] pMajor - returns the major version of the library -* @param[out] pMinor - returns the minor version of the library -* @param[out] pMicro - returns the micro version of the library +* @param[out] pInstance - New SieveCalculator instance * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_getlibraryversion(LibPrimes_uint32 * pMajor, LibPrimes_uint32 * pMinor, LibPrimes_uint32 * pMicro); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_createsievecalculator(LibPrimes_SieveCalculator * pInstance); /** * Handles Library Journaling diff --git a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.hpp b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.hpp index cd5f3734..f8d5ab77 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.hpp +++ b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.hpp @@ -1,15 +1,15 @@ /*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. Abstract: This is an autogenerated C++ Header file in order to allow an easy use - of Prime Numbers Interface + of Prime Numbers Library -Interface version: 1.3.0 +Interface version: 1.2.0 */ @@ -162,15 +162,15 @@ class CLibPrimesCalculator : public CLibPrimesBaseClass { void SetValue (const LibPrimes_uint64 nValue); /** - * CLibPrimesCalculator::SetProgressCallback - Sets the progress callback function - * @param[in] pProgressCallback - The progress callback + * CLibPrimesCalculator::Calculate - Performs the specific calculation of this Calculator */ - void SetProgressCallback (const LibPrimesProgressCallback pProgressCallback); + void Calculate (); /** - * CLibPrimesCalculator::Calculate - Performs the specific calculation of this Calculator + * CLibPrimesCalculator::SetProgressCallback - Sets the progress callback function + * @param[in] pProgressCallback - The progress callback */ - void Calculate (); + void SetProgressCallback (const LibPrimesProgressCallback pProgressCallback); }; /************************************************************************************************************************* @@ -185,17 +185,10 @@ class CLibPrimesFactorizationCalculator : public CLibPrimesCalculator { CLibPrimesFactorizationCalculator (LibPrimesHandle pHandle); /** - * CLibPrimesFactorizationCalculator::GetPrimeFactors - Returns the prime factors of this number (with multiplicity) + * CLibPrimesFactorizationCalculator::GetPrimeFactors - Returns the prime factors of this number (without multiplicity) * @param[out] PrimeFactorsBuffer - The prime factors of this number */ void GetPrimeFactors (std::vector & PrimeFactorsBuffer); - - /** - * CLibPrimesFactorizationCalculator::CheckPrimeFactors - Checks, whether a list of prime factors (with multiplicity) is the prime factor decomposistion of the calculator's value - * @param[in] PrimeFactorsBuffer - - * @return Do the prime factors decompose this calculator's value - */ - bool CheckPrimeFactors (const CLibPrimesInputVector & PrimeFactorsBuffer); }; /************************************************************************************************************************* @@ -223,18 +216,6 @@ class CLibPrimesWrapper { public: static void CheckError(LibPrimesHandle handle, LibPrimesResult nResult); - /** - * CLibPrimesWrapper::CreateFactorizationCalculator - Creates a new FactorizationCalculator instance - * @return New FactorizationCalculator instance - */ - static PLibPrimesFactorizationCalculator CreateFactorizationCalculator (); - - /** - * CLibPrimesWrapper::CreateSieveCalculator - Creates a new SieveCalculator instance - * @return New SieveCalculator instance - */ - static PLibPrimesSieveCalculator CreateSieveCalculator (); - /** * CLibPrimesWrapper::ReleaseInstance - Releases the memory of an Instance * @param[in] pInstance - Instance Handle @@ -249,6 +230,18 @@ class CLibPrimesWrapper { */ static void GetLibraryVersion (LibPrimes_uint32 & nMajor, LibPrimes_uint32 & nMinor, LibPrimes_uint32 & nMicro); + /** + * CLibPrimesWrapper::CreateFactorizationCalculator - Creates a new FactorizationCalculator instance + * @return New FactorizationCalculator instance + */ + static PLibPrimesFactorizationCalculator CreateFactorizationCalculator (); + + /** + * CLibPrimesWrapper::CreateSieveCalculator - Creates a new SieveCalculator instance + * @return New SieveCalculator instance + */ + static PLibPrimesSieveCalculator CreateSieveCalculator (); + /** * CLibPrimesWrapper::SetJournal - Handles Library Journaling * @param[in] sFileName - Journal FileName diff --git a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes_types.h b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes_types.h index 1eb111f0..e8a5027e 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes_types.h +++ b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes_types.h @@ -1,15 +1,15 @@ /*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. Abstract: This is an autogenerated plain C Header file with basic types in -order to allow an easy use of Prime Numbers Interface +order to allow an easy use of Prime Numbers Library -Interface version: 1.3.0 +Interface version: 1.2.0 */ @@ -61,7 +61,7 @@ typedef void * LibPrimesHandle; **************************************************************************************************************************/ #define LIBPRIMES_VERSION_MAJOR 1 -#define LIBPRIMES_VERSION_MINOR 3 +#define LIBPRIMES_VERSION_MINOR 2 #define LIBPRIMES_VERSION_MICRO 0 /************************************************************************************************************************* diff --git a/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.h b/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.h index 67e6a262..d798c7e1 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.h +++ b/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.h @@ -1,15 +1,15 @@ /*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. Abstract: This is an autogenerated plain C Header file in order to allow an easy - use of Prime Numbers Interface + use of Prime Numbers Library -Interface version: 1.3.0 +Interface version: 1.2.0 */ @@ -42,28 +42,28 @@ typedef LibPrimesResult (*PLibPrimesCalculator_GetValuePtr) (LibPrimes_Calculato typedef LibPrimesResult (*PLibPrimesCalculator_SetValuePtr) (LibPrimes_Calculator pCalculator, LibPrimes_uint64 nValue); /** -* Sets the progress callback function +* Performs the specific calculation of this Calculator * * @param[in] pCalculator - Calculator instance. -* @param[in] pProgressCallback - The progress callback * @return error code or 0 (success) */ -typedef LibPrimesResult (*PLibPrimesCalculator_SetProgressCallbackPtr) (LibPrimes_Calculator pCalculator, LibPrimesProgressCallback pProgressCallback); +typedef LibPrimesResult (*PLibPrimesCalculator_CalculatePtr) (LibPrimes_Calculator pCalculator); /** -* Performs the specific calculation of this Calculator +* Sets the progress callback function * * @param[in] pCalculator - Calculator instance. +* @param[in] pProgressCallback - The progress callback * @return error code or 0 (success) */ -typedef LibPrimesResult (*PLibPrimesCalculator_CalculatePtr) (LibPrimes_Calculator pCalculator); +typedef LibPrimesResult (*PLibPrimesCalculator_SetProgressCallbackPtr) (LibPrimes_Calculator pCalculator, LibPrimesProgressCallback pProgressCallback); /************************************************************************************************************************* Class definition for FactorizationCalculator **************************************************************************************************************************/ /** -* Returns the prime factors of this number (with multiplicity) +* Returns the prime factors of this number (without multiplicity) * * @param[in] pFactorizationCalculator - FactorizationCalculator instance. * @param[in] nPrimeFactorsBufferSize - Number of elements in buffer @@ -73,17 +73,6 @@ typedef LibPrimesResult (*PLibPrimesCalculator_CalculatePtr) (LibPrimes_Calculat */ typedef LibPrimesResult (*PLibPrimesFactorizationCalculator_GetPrimeFactorsPtr) (LibPrimes_FactorizationCalculator pFactorizationCalculator, const LibPrimes_uint64 nPrimeFactorsBufferSize, LibPrimes_uint64* pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer); -/** -* Checks, whether a list of prime factors (with multiplicity) is the prime factor decomposistion of the calculator's value -* -* @param[in] pFactorizationCalculator - FactorizationCalculator instance. -* @param[in] nPrimeFactorsBufferSize - Number of elements in buffer -* @param[in] pPrimeFactorsBuffer - PrimeFactor buffer of -* @param[out] pAreEqual - Do the prime factors decompose this calculator's value -* @return error code or 0 (success) -*/ -typedef LibPrimesResult (*PLibPrimesFactorizationCalculator_CheckPrimeFactorsPtr) (LibPrimes_FactorizationCalculator pFactorizationCalculator, LibPrimes_uint64 nPrimeFactorsBufferSize, const sLibPrimesPrimeFactor * pPrimeFactorsBuffer, bool * pAreEqual); - /************************************************************************************************************************* Class definition for SieveCalculator **************************************************************************************************************************/ @@ -104,38 +93,38 @@ typedef LibPrimesResult (*PLibPrimesSieveCalculator_GetPrimesPtr) (LibPrimes_Sie **************************************************************************************************************************/ /** -* Creates a new FactorizationCalculator instance +* Releases the memory of an Instance * -* @param[out] pInstance - New FactorizationCalculator instance +* @param[in] pInstance - Instance Handle * @return error code or 0 (success) */ -typedef LibPrimesResult (*PLibPrimesCreateFactorizationCalculatorPtr) (LibPrimes_FactorizationCalculator * pInstance); +typedef LibPrimesResult (*PLibPrimesReleaseInstancePtr) (LibPrimes_BaseClass pInstance); /** -* Creates a new SieveCalculator instance +* retrieves the current version of the library. * -* @param[out] pInstance - New SieveCalculator instance +* @param[out] pMajor - returns the major version of the library +* @param[out] pMinor - returns the minor version of the library +* @param[out] pMicro - returns the micro version of the library * @return error code or 0 (success) */ -typedef LibPrimesResult (*PLibPrimesCreateSieveCalculatorPtr) (LibPrimes_SieveCalculator * pInstance); +typedef LibPrimesResult (*PLibPrimesGetLibraryVersionPtr) (LibPrimes_uint32 * pMajor, LibPrimes_uint32 * pMinor, LibPrimes_uint32 * pMicro); /** -* Releases the memory of an Instance +* Creates a new FactorizationCalculator instance * -* @param[in] pInstance - Instance Handle +* @param[out] pInstance - New FactorizationCalculator instance * @return error code or 0 (success) */ -typedef LibPrimesResult (*PLibPrimesReleaseInstancePtr) (LibPrimes_BaseClass pInstance); +typedef LibPrimesResult (*PLibPrimesCreateFactorizationCalculatorPtr) (LibPrimes_FactorizationCalculator * pInstance); /** -* retrieves the current version of the library. +* Creates a new SieveCalculator instance * -* @param[out] pMajor - returns the major version of the library -* @param[out] pMinor - returns the minor version of the library -* @param[out] pMicro - returns the micro version of the library +* @param[out] pInstance - New SieveCalculator instance * @return error code or 0 (success) */ -typedef LibPrimesResult (*PLibPrimesGetLibraryVersionPtr) (LibPrimes_uint32 * pMajor, LibPrimes_uint32 * pMinor, LibPrimes_uint32 * pMicro); +typedef LibPrimesResult (*PLibPrimesCreateSieveCalculatorPtr) (LibPrimes_SieveCalculator * pInstance); /** * Handles Library Journaling @@ -153,15 +142,14 @@ typedef struct { void * m_LibraryHandle; PLibPrimesCalculator_GetValuePtr m_Calculator_GetValue; PLibPrimesCalculator_SetValuePtr m_Calculator_SetValue; - PLibPrimesCalculator_SetProgressCallbackPtr m_Calculator_SetProgressCallback; PLibPrimesCalculator_CalculatePtr m_Calculator_Calculate; + PLibPrimesCalculator_SetProgressCallbackPtr m_Calculator_SetProgressCallback; PLibPrimesFactorizationCalculator_GetPrimeFactorsPtr m_FactorizationCalculator_GetPrimeFactors; - PLibPrimesFactorizationCalculator_CheckPrimeFactorsPtr m_FactorizationCalculator_CheckPrimeFactors; PLibPrimesSieveCalculator_GetPrimesPtr m_SieveCalculator_GetPrimes; - PLibPrimesCreateFactorizationCalculatorPtr m_CreateFactorizationCalculator; - PLibPrimesCreateSieveCalculatorPtr m_CreateSieveCalculator; PLibPrimesReleaseInstancePtr m_ReleaseInstance; PLibPrimesGetLibraryVersionPtr m_GetLibraryVersion; + PLibPrimesCreateFactorizationCalculatorPtr m_CreateFactorizationCalculator; + PLibPrimesCreateSieveCalculatorPtr m_CreateSieveCalculator; PLibPrimesSetJournalPtr m_SetJournal; } sLibPrimesDynamicWrapperTable; diff --git a/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.hpp b/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.hpp index 3e897e86..91b5e27c 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.hpp +++ b/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.hpp @@ -1,15 +1,15 @@ /*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. Abstract: This is an autogenerated C++ Header file in order to allow an easy - use of Prime Numbers Interface + use of Prime Numbers Library -Interface version: 1.3.0 +Interface version: 1.2.0 */ @@ -138,7 +138,7 @@ class CLibPrimesWrapper { CheckError (nullptr, initWrapperTable (&m_WrapperTable)); CheckError (nullptr, loadWrapperTable (&m_WrapperTable, sFileName.c_str ())); - CheckError(nullptr, CheckVersion()); + CheckError(nullptr, checkBinaryVersion()); } static PLibPrimesWrapper loadLibrary (const std::string &sFileName) @@ -158,16 +158,17 @@ class CLibPrimesWrapper { } - PLibPrimesFactorizationCalculator CreateFactorizationCalculator (); - PLibPrimesSieveCalculator CreateSieveCalculator (); void ReleaseInstance (CLibPrimesBaseClass * pInstance); void GetLibraryVersion (LibPrimes_uint32 & nMajor, LibPrimes_uint32 & nMinor, LibPrimes_uint32 & nMicro); + PLibPrimesFactorizationCalculator CreateFactorizationCalculator (); + PLibPrimesSieveCalculator CreateSieveCalculator (); void SetJournal (const std::string & sFileName); private: sLibPrimesDynamicWrapperTable m_WrapperTable; - LibPrimesResult CheckVersion() { + LibPrimesResult checkBinaryVersion() + { LibPrimes_uint32 nMajor, nMinor, nMicro; GetLibraryVersion(nMajor, nMinor, nMicro); if ( (nMajor != LIBPRIMES_VERSION_MAJOR) || (nMinor < LIBPRIMES_VERSION_MINOR) ) { @@ -248,8 +249,8 @@ class CLibPrimesCalculator : public CLibPrimesBaseClass { LibPrimes_uint64 GetValue (); void SetValue (const LibPrimes_uint64 nValue); - void SetProgressCallback (const LibPrimesProgressCallback pProgressCallback); void Calculate (); + void SetProgressCallback (const LibPrimesProgressCallback pProgressCallback); }; /************************************************************************************************************************* @@ -267,7 +268,6 @@ class CLibPrimesFactorizationCalculator : public CLibPrimesCalculator { } void GetPrimeFactors (std::vector & PrimeFactorsBuffer); - bool CheckPrimeFactors (const CLibPrimesInputVector & PrimeFactorsBuffer); }; /************************************************************************************************************************* @@ -287,28 +287,6 @@ class CLibPrimesSieveCalculator : public CLibPrimesCalculator { void GetPrimes (std::vector & PrimesBuffer); }; - /** - * CLibPrimesWrapper::CreateFactorizationCalculator - Creates a new FactorizationCalculator instance - * @return New FactorizationCalculator instance - */ - inline PLibPrimesFactorizationCalculator CLibPrimesWrapper::CreateFactorizationCalculator () - { - LibPrimesHandle hInstance = nullptr; - CheckError (nullptr, m_WrapperTable.m_CreateFactorizationCalculator (&hInstance) ); - return std::make_shared (this, hInstance); - } - - /** - * CLibPrimesWrapper::CreateSieveCalculator - Creates a new SieveCalculator instance - * @return New SieveCalculator instance - */ - inline PLibPrimesSieveCalculator CLibPrimesWrapper::CreateSieveCalculator () - { - LibPrimesHandle hInstance = nullptr; - CheckError (nullptr, m_WrapperTable.m_CreateSieveCalculator (&hInstance) ); - return std::make_shared (this, hInstance); - } - /** * CLibPrimesWrapper::ReleaseInstance - Releases the memory of an Instance * @param[in] pInstance - Instance Handle @@ -333,6 +311,28 @@ class CLibPrimesSieveCalculator : public CLibPrimesCalculator { CheckError (nullptr, m_WrapperTable.m_GetLibraryVersion (&nMajor, &nMinor, &nMicro) ); } + /** + * CLibPrimesWrapper::CreateFactorizationCalculator - Creates a new FactorizationCalculator instance + * @return New FactorizationCalculator instance + */ + inline PLibPrimesFactorizationCalculator CLibPrimesWrapper::CreateFactorizationCalculator () + { + LibPrimesHandle hInstance = nullptr; + CheckError (nullptr, m_WrapperTable.m_CreateFactorizationCalculator (&hInstance) ); + return std::make_shared (this, hInstance); + } + + /** + * CLibPrimesWrapper::CreateSieveCalculator - Creates a new SieveCalculator instance + * @return New SieveCalculator instance + */ + inline PLibPrimesSieveCalculator CLibPrimesWrapper::CreateSieveCalculator () + { + LibPrimesHandle hInstance = nullptr; + CheckError (nullptr, m_WrapperTable.m_CreateSieveCalculator (&hInstance) ); + return std::make_shared (this, hInstance); + } + /** * CLibPrimesWrapper::SetJournal - Handles Library Journaling * @param[in] sFileName - Journal FileName @@ -350,15 +350,14 @@ class CLibPrimesSieveCalculator : public CLibPrimesCalculator { pWrapperTable->m_LibraryHandle = nullptr; pWrapperTable->m_Calculator_GetValue = nullptr; pWrapperTable->m_Calculator_SetValue = nullptr; - pWrapperTable->m_Calculator_SetProgressCallback = nullptr; pWrapperTable->m_Calculator_Calculate = nullptr; + pWrapperTable->m_Calculator_SetProgressCallback = nullptr; pWrapperTable->m_FactorizationCalculator_GetPrimeFactors = nullptr; - pWrapperTable->m_FactorizationCalculator_CheckPrimeFactors = nullptr; pWrapperTable->m_SieveCalculator_GetPrimes = nullptr; - pWrapperTable->m_CreateFactorizationCalculator = nullptr; - pWrapperTable->m_CreateSieveCalculator = nullptr; pWrapperTable->m_ReleaseInstance = nullptr; pWrapperTable->m_GetLibraryVersion = nullptr; + pWrapperTable->m_CreateFactorizationCalculator = nullptr; + pWrapperTable->m_CreateSieveCalculator = nullptr; pWrapperTable->m_SetJournal = nullptr; return LIBPRIMES_SUCCESS; @@ -418,15 +417,6 @@ class CLibPrimesSieveCalculator : public CLibPrimesCalculator { if (pWrapperTable->m_Calculator_SetValue == nullptr) return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; - #ifdef WIN32 - pWrapperTable->m_Calculator_SetProgressCallback = (PLibPrimesCalculator_SetProgressCallbackPtr) GetProcAddress (hLibrary, "libprimes_calculator_setprogresscallback"); - #else // WIN32 - pWrapperTable->m_Calculator_SetProgressCallback = (PLibPrimesCalculator_SetProgressCallbackPtr) dlsym (hLibrary, "libprimes_calculator_setprogresscallback"); - dlerror(); - #endif // WIN32 - if (pWrapperTable->m_Calculator_SetProgressCallback == nullptr) - return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; - #ifdef WIN32 pWrapperTable->m_Calculator_Calculate = (PLibPrimesCalculator_CalculatePtr) GetProcAddress (hLibrary, "libprimes_calculator_calculate"); #else // WIN32 @@ -437,21 +427,21 @@ class CLibPrimesSieveCalculator : public CLibPrimesCalculator { return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; #ifdef WIN32 - pWrapperTable->m_FactorizationCalculator_GetPrimeFactors = (PLibPrimesFactorizationCalculator_GetPrimeFactorsPtr) GetProcAddress (hLibrary, "libprimes_factorizationcalculator_getprimefactors"); + pWrapperTable->m_Calculator_SetProgressCallback = (PLibPrimesCalculator_SetProgressCallbackPtr) GetProcAddress (hLibrary, "libprimes_calculator_setprogresscallback"); #else // WIN32 - pWrapperTable->m_FactorizationCalculator_GetPrimeFactors = (PLibPrimesFactorizationCalculator_GetPrimeFactorsPtr) dlsym (hLibrary, "libprimes_factorizationcalculator_getprimefactors"); + pWrapperTable->m_Calculator_SetProgressCallback = (PLibPrimesCalculator_SetProgressCallbackPtr) dlsym (hLibrary, "libprimes_calculator_setprogresscallback"); dlerror(); #endif // WIN32 - if (pWrapperTable->m_FactorizationCalculator_GetPrimeFactors == nullptr) + if (pWrapperTable->m_Calculator_SetProgressCallback == nullptr) return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; #ifdef WIN32 - pWrapperTable->m_FactorizationCalculator_CheckPrimeFactors = (PLibPrimesFactorizationCalculator_CheckPrimeFactorsPtr) GetProcAddress (hLibrary, "libprimes_factorizationcalculator_checkprimefactors"); + pWrapperTable->m_FactorizationCalculator_GetPrimeFactors = (PLibPrimesFactorizationCalculator_GetPrimeFactorsPtr) GetProcAddress (hLibrary, "libprimes_factorizationcalculator_getprimefactors"); #else // WIN32 - pWrapperTable->m_FactorizationCalculator_CheckPrimeFactors = (PLibPrimesFactorizationCalculator_CheckPrimeFactorsPtr) dlsym (hLibrary, "libprimes_factorizationcalculator_checkprimefactors"); + pWrapperTable->m_FactorizationCalculator_GetPrimeFactors = (PLibPrimesFactorizationCalculator_GetPrimeFactorsPtr) dlsym (hLibrary, "libprimes_factorizationcalculator_getprimefactors"); dlerror(); #endif // WIN32 - if (pWrapperTable->m_FactorizationCalculator_CheckPrimeFactors == nullptr) + if (pWrapperTable->m_FactorizationCalculator_GetPrimeFactors == nullptr) return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; #ifdef WIN32 @@ -464,39 +454,39 @@ class CLibPrimesSieveCalculator : public CLibPrimesCalculator { return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; #ifdef WIN32 - pWrapperTable->m_CreateFactorizationCalculator = (PLibPrimesCreateFactorizationCalculatorPtr) GetProcAddress (hLibrary, "libprimes_createfactorizationcalculator"); + pWrapperTable->m_ReleaseInstance = (PLibPrimesReleaseInstancePtr) GetProcAddress (hLibrary, "libprimes_releaseinstance"); #else // WIN32 - pWrapperTable->m_CreateFactorizationCalculator = (PLibPrimesCreateFactorizationCalculatorPtr) dlsym (hLibrary, "libprimes_createfactorizationcalculator"); + pWrapperTable->m_ReleaseInstance = (PLibPrimesReleaseInstancePtr) dlsym (hLibrary, "libprimes_releaseinstance"); dlerror(); #endif // WIN32 - if (pWrapperTable->m_CreateFactorizationCalculator == nullptr) + if (pWrapperTable->m_ReleaseInstance == nullptr) return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; #ifdef WIN32 - pWrapperTable->m_CreateSieveCalculator = (PLibPrimesCreateSieveCalculatorPtr) GetProcAddress (hLibrary, "libprimes_createsievecalculator"); + pWrapperTable->m_GetLibraryVersion = (PLibPrimesGetLibraryVersionPtr) GetProcAddress (hLibrary, "libprimes_getlibraryversion"); #else // WIN32 - pWrapperTable->m_CreateSieveCalculator = (PLibPrimesCreateSieveCalculatorPtr) dlsym (hLibrary, "libprimes_createsievecalculator"); + pWrapperTable->m_GetLibraryVersion = (PLibPrimesGetLibraryVersionPtr) dlsym (hLibrary, "libprimes_getlibraryversion"); dlerror(); #endif // WIN32 - if (pWrapperTable->m_CreateSieveCalculator == nullptr) + if (pWrapperTable->m_GetLibraryVersion == nullptr) return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; #ifdef WIN32 - pWrapperTable->m_ReleaseInstance = (PLibPrimesReleaseInstancePtr) GetProcAddress (hLibrary, "libprimes_releaseinstance"); + pWrapperTable->m_CreateFactorizationCalculator = (PLibPrimesCreateFactorizationCalculatorPtr) GetProcAddress (hLibrary, "libprimes_createfactorizationcalculator"); #else // WIN32 - pWrapperTable->m_ReleaseInstance = (PLibPrimesReleaseInstancePtr) dlsym (hLibrary, "libprimes_releaseinstance"); + pWrapperTable->m_CreateFactorizationCalculator = (PLibPrimesCreateFactorizationCalculatorPtr) dlsym (hLibrary, "libprimes_createfactorizationcalculator"); dlerror(); #endif // WIN32 - if (pWrapperTable->m_ReleaseInstance == nullptr) + if (pWrapperTable->m_CreateFactorizationCalculator == nullptr) return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; #ifdef WIN32 - pWrapperTable->m_GetLibraryVersion = (PLibPrimesGetLibraryVersionPtr) GetProcAddress (hLibrary, "libprimes_getlibraryversion"); + pWrapperTable->m_CreateSieveCalculator = (PLibPrimesCreateSieveCalculatorPtr) GetProcAddress (hLibrary, "libprimes_createsievecalculator"); #else // WIN32 - pWrapperTable->m_GetLibraryVersion = (PLibPrimesGetLibraryVersionPtr) dlsym (hLibrary, "libprimes_getlibraryversion"); + pWrapperTable->m_CreateSieveCalculator = (PLibPrimesCreateSieveCalculatorPtr) dlsym (hLibrary, "libprimes_createsievecalculator"); dlerror(); #endif // WIN32 - if (pWrapperTable->m_GetLibraryVersion == nullptr) + if (pWrapperTable->m_CreateSieveCalculator == nullptr) return LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT; #ifdef WIN32 @@ -529,14 +519,14 @@ class CLibPrimesSieveCalculator : public CLibPrimesCalculator { CheckError ( m_pWrapper->m_WrapperTable.m_Calculator_SetValue (m_pHandle, nValue) ); } - void CLibPrimesCalculator::SetProgressCallback (const LibPrimesProgressCallback pProgressCallback) + void CLibPrimesCalculator::Calculate () { - CheckError ( m_pWrapper->m_WrapperTable.m_Calculator_SetProgressCallback (m_pHandle, pProgressCallback) ); + CheckError ( m_pWrapper->m_WrapperTable.m_Calculator_Calculate (m_pHandle) ); } - void CLibPrimesCalculator::Calculate () + void CLibPrimesCalculator::SetProgressCallback (const LibPrimesProgressCallback pProgressCallback) { - CheckError ( m_pWrapper->m_WrapperTable.m_Calculator_Calculate (m_pHandle) ); + CheckError ( m_pWrapper->m_WrapperTable.m_Calculator_SetProgressCallback (m_pHandle, pProgressCallback) ); } /** @@ -552,13 +542,6 @@ class CLibPrimesSieveCalculator : public CLibPrimesCalculator { CheckError ( m_pWrapper->m_WrapperTable.m_FactorizationCalculator_GetPrimeFactors (m_pHandle, elementsNeededPrimeFactors, &elementsWrittenPrimeFactors, PrimeFactorsBuffer.data()) ); } - bool CLibPrimesFactorizationCalculator::CheckPrimeFactors (const CLibPrimesInputVector & PrimeFactorsBuffer) - { - bool resultAreEqual = 0; - CheckError ( m_pWrapper->m_WrapperTable.m_FactorizationCalculator_CheckPrimeFactors (m_pHandle, (LibPrimes_uint64)PrimeFactorsBuffer.size(), PrimeFactorsBuffer.data(), &resultAreEqual) ); - return resultAreEqual; - } - /** * Method definitions for class CLibPrimesSieveCalculator */ diff --git a/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_types.h b/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_types.h index 1eb111f0..e8a5027e 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_types.h +++ b/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_types.h @@ -1,15 +1,15 @@ /*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. Abstract: This is an autogenerated plain C Header file with basic types in -order to allow an easy use of Prime Numbers Interface +order to allow an easy use of Prime Numbers Library -Interface version: 1.3.0 +Interface version: 1.2.0 */ @@ -61,7 +61,7 @@ typedef void * LibPrimesHandle; **************************************************************************************************************************/ #define LIBPRIMES_VERSION_MAJOR 1 -#define LIBPRIMES_VERSION_MINOR 3 +#define LIBPRIMES_VERSION_MINOR 2 #define LIBPRIMES_VERSION_MICRO 0 /************************************************************************************************************************* diff --git a/Examples/Primes/LibPrimes_component/Bindings/Pascal/Unit_LibPrimes.pas b/Examples/Primes/LibPrimes_component/Bindings/Pascal/Unit_LibPrimes.pas index 367ea11f..ae2aa977 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/Pascal/Unit_LibPrimes.pas +++ b/Examples/Primes/LibPrimes_component/Bindings/Pascal/Unit_LibPrimes.pas @@ -1,16 +1,16 @@ {$IFDEF FPC}{$MODE DELPHI}{$ENDIF} (*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. Abstract: This is an autogenerated Pascal Header file in order to allow an easy - use of Prime Numbers Interface + use of Prime Numbers Library -Interface version: 1.3.0 +Interface version: 1.2.0 *) @@ -34,7 +34,7 @@ interface const LIBPRIMES_VERSION_MAJOR = 1; - LIBPRIMES_VERSION_MINOR = 3; + LIBPRIMES_VERSION_MINOR = 2; LIBPRIMES_VERSION_MICRO = 0; @@ -128,21 +128,21 @@ TLibPrimesSieveCalculator = class; TLibPrimesCalculator_SetValueFunc = function (pCalculator: TLibPrimesHandle; const nValue: QWord): TLibPrimesResult; cdecl; (** - * Sets the progress callback function + * Performs the specific calculation of this Calculator * * @param[in] pCalculator - Calculator instance. - * @param[in] pProgressCallback - The progress callback * @return error code or 0 (success) *) - TLibPrimesCalculator_SetProgressCallbackFunc = function (pCalculator: TLibPrimesHandle; const pProgressCallback: PLibPrimes_ProgressCallback): TLibPrimesResult; cdecl; + TLibPrimesCalculator_CalculateFunc = function (pCalculator: TLibPrimesHandle): TLibPrimesResult; cdecl; (** - * Performs the specific calculation of this Calculator + * Sets the progress callback function * * @param[in] pCalculator - Calculator instance. + * @param[in] pProgressCallback - The progress callback * @return error code or 0 (success) *) - TLibPrimesCalculator_CalculateFunc = function (pCalculator: TLibPrimesHandle): TLibPrimesResult; cdecl; + TLibPrimesCalculator_SetProgressCallbackFunc = function (pCalculator: TLibPrimesHandle; const pProgressCallback: PLibPrimes_ProgressCallback): TLibPrimesResult; cdecl; (************************************************************************************************************************* @@ -150,7 +150,7 @@ TLibPrimesSieveCalculator = class; **************************************************************************************************************************) (** - * Returns the prime factors of this number (with multiplicity) + * Returns the prime factors of this number (without multiplicity) * * @param[in] pFactorizationCalculator - FactorizationCalculator instance. * @param[in] nPrimeFactorsCount - Number of elements in buffer @@ -160,17 +160,6 @@ TLibPrimesSieveCalculator = class; *) TLibPrimesFactorizationCalculator_GetPrimeFactorsFunc = function (pFactorizationCalculator: TLibPrimesHandle; const nPrimeFactorsCount: QWord; out pPrimeFactorsNeededCount: QWord; pPrimeFactorsBuffer: PLibPrimesPrimeFactor): TLibPrimesResult; cdecl; - (** - * Checks, whether a list of prime factors (with multiplicity) is the prime factor decomposistion of the calculator's value - * - * @param[in] pFactorizationCalculator - FactorizationCalculator instance. - * @param[in] nPrimeFactorsCount - Number of elements in buffer - * @param[in] pPrimeFactorsBuffer - PrimeFactor buffer of - * @param[out] pAreEqual - Do the prime factors decompose this calculator's value - * @return error code or 0 (success) - *) - TLibPrimesFactorizationCalculator_CheckPrimeFactorsFunc = function (pFactorizationCalculator: TLibPrimesHandle; const nPrimeFactorsCount: QWord; const pPrimeFactorsBuffer: PLibPrimesPrimeFactor; out pAreEqual: Cardinal): TLibPrimesResult; cdecl; - (************************************************************************************************************************* Function type definitions for SieveCalculator @@ -192,38 +181,38 @@ TLibPrimesSieveCalculator = class; **************************************************************************************************************************) (** - * Creates a new FactorizationCalculator instance + * Releases the memory of an Instance * - * @param[out] pInstance - New FactorizationCalculator instance + * @param[in] pInstance - Instance Handle * @return error code or 0 (success) *) - TLibPrimesCreateFactorizationCalculatorFunc = function (out pInstance: TLibPrimesHandle): TLibPrimesResult; cdecl; + TLibPrimesReleaseInstanceFunc = function (const pInstance: TLibPrimesHandle): TLibPrimesResult; cdecl; (** - * Creates a new SieveCalculator instance + * retrieves the current version of the library. * - * @param[out] pInstance - New SieveCalculator instance + * @param[out] pMajor - returns the major version of the library + * @param[out] pMinor - returns the minor version of the library + * @param[out] pMicro - returns the micro version of the library * @return error code or 0 (success) *) - TLibPrimesCreateSieveCalculatorFunc = function (out pInstance: TLibPrimesHandle): TLibPrimesResult; cdecl; + TLibPrimesGetLibraryVersionFunc = function (out pMajor: Cardinal; out pMinor: Cardinal; out pMicro: Cardinal): TLibPrimesResult; cdecl; (** - * Releases the memory of an Instance + * Creates a new FactorizationCalculator instance * - * @param[in] pInstance - Instance Handle + * @param[out] pInstance - New FactorizationCalculator instance * @return error code or 0 (success) *) - TLibPrimesReleaseInstanceFunc = function (const pInstance: TLibPrimesHandle): TLibPrimesResult; cdecl; + TLibPrimesCreateFactorizationCalculatorFunc = function (out pInstance: TLibPrimesHandle): TLibPrimesResult; cdecl; (** - * retrieves the current version of the library. + * Creates a new SieveCalculator instance * - * @param[out] pMajor - returns the major version of the library - * @param[out] pMinor - returns the minor version of the library - * @param[out] pMicro - returns the micro version of the library + * @param[out] pInstance - New SieveCalculator instance * @return error code or 0 (success) *) - TLibPrimesGetLibraryVersionFunc = function (out pMajor: Cardinal; out pMinor: Cardinal; out pMicro: Cardinal): TLibPrimesResult; cdecl; + TLibPrimesCreateSieveCalculatorFunc = function (out pInstance: TLibPrimesHandle): TLibPrimesResult; cdecl; (** * Handles Library Journaling @@ -273,8 +262,8 @@ TLibPrimesCalculator = class (TLibPrimesBaseClass) destructor Destroy; override; function GetValue(): QWord; procedure SetValue(const AValue: QWord); - procedure SetProgressCallback(const AProgressCallback: PLibPrimes_ProgressCallback); procedure Calculate(); + procedure SetProgressCallback(const AProgressCallback: PLibPrimes_ProgressCallback); end; @@ -288,7 +277,6 @@ TLibPrimesFactorizationCalculator = class (TLibPrimesCalculator) constructor Create (AWrapper: TLibPrimesWrapper; AHandle: TLibPrimesHandle); destructor Destroy; override; procedure GetPrimeFactors(out APrimeFactors: ArrayOfLibPrimesPrimeFactor); - function CheckPrimeFactors(const APrimeFactors: ArrayOfLibPrimesPrimeFactor): Boolean; end; @@ -313,15 +301,14 @@ TLibPrimesWrapper = class (TObject) FModule: HMODULE; FLibPrimesCalculator_GetValueFunc: TLibPrimesCalculator_GetValueFunc; FLibPrimesCalculator_SetValueFunc: TLibPrimesCalculator_SetValueFunc; - FLibPrimesCalculator_SetProgressCallbackFunc: TLibPrimesCalculator_SetProgressCallbackFunc; FLibPrimesCalculator_CalculateFunc: TLibPrimesCalculator_CalculateFunc; + FLibPrimesCalculator_SetProgressCallbackFunc: TLibPrimesCalculator_SetProgressCallbackFunc; FLibPrimesFactorizationCalculator_GetPrimeFactorsFunc: TLibPrimesFactorizationCalculator_GetPrimeFactorsFunc; - FLibPrimesFactorizationCalculator_CheckPrimeFactorsFunc: TLibPrimesFactorizationCalculator_CheckPrimeFactorsFunc; FLibPrimesSieveCalculator_GetPrimesFunc: TLibPrimesSieveCalculator_GetPrimesFunc; - FLibPrimesCreateFactorizationCalculatorFunc: TLibPrimesCreateFactorizationCalculatorFunc; - FLibPrimesCreateSieveCalculatorFunc: TLibPrimesCreateSieveCalculatorFunc; FLibPrimesReleaseInstanceFunc: TLibPrimesReleaseInstanceFunc; FLibPrimesGetLibraryVersionFunc: TLibPrimesGetLibraryVersionFunc; + FLibPrimesCreateFactorizationCalculatorFunc: TLibPrimesCreateFactorizationCalculatorFunc; + FLibPrimesCreateSieveCalculatorFunc: TLibPrimesCreateSieveCalculatorFunc; FLibPrimesSetJournalFunc: TLibPrimesSetJournalFunc; {$IFDEF MSWINDOWS} @@ -330,29 +317,28 @@ TLibPrimesWrapper = class (TObject) function LoadFunction (AFunctionName: AnsiString; FailIfNotExistent: Boolean = True): Pointer; {$ENDIF MSWINDOWS} - procedure CheckVersion(); + procedure checkBinaryVersion(); protected property LibPrimesCalculator_GetValueFunc: TLibPrimesCalculator_GetValueFunc read FLibPrimesCalculator_GetValueFunc; property LibPrimesCalculator_SetValueFunc: TLibPrimesCalculator_SetValueFunc read FLibPrimesCalculator_SetValueFunc; - property LibPrimesCalculator_SetProgressCallbackFunc: TLibPrimesCalculator_SetProgressCallbackFunc read FLibPrimesCalculator_SetProgressCallbackFunc; property LibPrimesCalculator_CalculateFunc: TLibPrimesCalculator_CalculateFunc read FLibPrimesCalculator_CalculateFunc; + property LibPrimesCalculator_SetProgressCallbackFunc: TLibPrimesCalculator_SetProgressCallbackFunc read FLibPrimesCalculator_SetProgressCallbackFunc; property LibPrimesFactorizationCalculator_GetPrimeFactorsFunc: TLibPrimesFactorizationCalculator_GetPrimeFactorsFunc read FLibPrimesFactorizationCalculator_GetPrimeFactorsFunc; - property LibPrimesFactorizationCalculator_CheckPrimeFactorsFunc: TLibPrimesFactorizationCalculator_CheckPrimeFactorsFunc read FLibPrimesFactorizationCalculator_CheckPrimeFactorsFunc; property LibPrimesSieveCalculator_GetPrimesFunc: TLibPrimesSieveCalculator_GetPrimesFunc read FLibPrimesSieveCalculator_GetPrimesFunc; - property LibPrimesCreateFactorizationCalculatorFunc: TLibPrimesCreateFactorizationCalculatorFunc read FLibPrimesCreateFactorizationCalculatorFunc; - property LibPrimesCreateSieveCalculatorFunc: TLibPrimesCreateSieveCalculatorFunc read FLibPrimesCreateSieveCalculatorFunc; property LibPrimesReleaseInstanceFunc: TLibPrimesReleaseInstanceFunc read FLibPrimesReleaseInstanceFunc; property LibPrimesGetLibraryVersionFunc: TLibPrimesGetLibraryVersionFunc read FLibPrimesGetLibraryVersionFunc; + property LibPrimesCreateFactorizationCalculatorFunc: TLibPrimesCreateFactorizationCalculatorFunc read FLibPrimesCreateFactorizationCalculatorFunc; + property LibPrimesCreateSieveCalculatorFunc: TLibPrimesCreateSieveCalculatorFunc read FLibPrimesCreateSieveCalculatorFunc; property LibPrimesSetJournalFunc: TLibPrimesSetJournalFunc read FLibPrimesSetJournalFunc; procedure CheckError (AInstance: TLibPrimesBaseClass; AErrorCode: TLibPrimesResult); public constructor Create (ADLLName: String); destructor Destroy; override; - function CreateFactorizationCalculator(): TLibPrimesFactorizationCalculator; - function CreateSieveCalculator(): TLibPrimesSieveCalculator; procedure ReleaseInstance(const AInstance: TLibPrimesBaseClass); procedure GetLibraryVersion(out AMajor: Cardinal; out AMinor: Cardinal; out AMicro: Cardinal); + function CreateFactorizationCalculator(): TLibPrimesFactorizationCalculator; + function CreateSieveCalculator(): TLibPrimesSieveCalculator; procedure SetJournal(const AFileName: String); end; @@ -384,7 +370,7 @@ implementation ADescription := 'unknown'; end; - inherited Create (Format ('Prime Numbers Interface Error - %s (#%d)', [ ADescription, AErrorCode ])); + inherited Create (Format ('Prime Numbers Library Error - %s (#%d)', [ ADescription, AErrorCode ])); end; constructor ELibPrimesException.CreateCustomMessage (AErrorCode: TLibPrimesResult; AMessage: String); @@ -440,6 +426,11 @@ implementation FWrapper.CheckError (Self, FWrapper.LibPrimesCalculator_SetValueFunc (FHandle, AValue)); end; + procedure TLibPrimesCalculator.Calculate(); + begin + FWrapper.CheckError (Self, FWrapper.LibPrimesCalculator_CalculateFunc (FHandle)); + end; + procedure TLibPrimesCalculator.SetProgressCallback(const AProgressCallback: PLibPrimes_ProgressCallback); begin if not Assigned (AProgressCallback) then @@ -447,11 +438,6 @@ implementation FWrapper.CheckError (Self, FWrapper.LibPrimesCalculator_SetProgressCallbackFunc (FHandle, AProgressCallback)); end; - procedure TLibPrimesCalculator.Calculate(); - begin - FWrapper.CheckError (Self, FWrapper.LibPrimesCalculator_CalculateFunc (FHandle)); - end; - (************************************************************************************************************************* Class implementation for FactorizationCalculator **************************************************************************************************************************) @@ -478,25 +464,6 @@ implementation FWrapper.CheckError (Self, FWrapper.LibPrimesFactorizationCalculator_GetPrimeFactorsFunc (FHandle, countNeededPrimeFactors, countWrittenPrimeFactors, @APrimeFactors[0])); end; - function TLibPrimesFactorizationCalculator.CheckPrimeFactors(const APrimeFactors: ArrayOfLibPrimesPrimeFactor): Boolean; - var - PtrPrimeFactors: PLibPrimesPrimeFactor; - LenPrimeFactors: QWord; - ResultAreEqual: Cardinal; - begin - LenPrimeFactors := Length (APrimeFactors); - if LenPrimeFactors > $FFFFFFFF then - raise ELibPrimesException.CreateCustomMessage (LIBPRIMES_ERROR_INVALIDPARAM, 'array has too many entries.'); - if LenPrimeFactors > 0 then - PtrPrimeFactors := @APrimeFactors[0] - else - PtrPrimeFactors := nil; - - ResultAreEqual := 0; - FWrapper.CheckError (Self, FWrapper.LibPrimesFactorizationCalculator_CheckPrimeFactorsFunc (FHandle, QWord (LenPrimeFactors), PtrPrimeFactors, ResultAreEqual)); - Result := (ResultAreEqual <> 0); - end; - (************************************************************************************************************************* Class implementation for SieveCalculator **************************************************************************************************************************) @@ -545,18 +512,17 @@ implementation FLibPrimesCalculator_GetValueFunc := LoadFunction ('libprimes_calculator_getvalue'); FLibPrimesCalculator_SetValueFunc := LoadFunction ('libprimes_calculator_setvalue'); - FLibPrimesCalculator_SetProgressCallbackFunc := LoadFunction ('libprimes_calculator_setprogresscallback'); FLibPrimesCalculator_CalculateFunc := LoadFunction ('libprimes_calculator_calculate'); + FLibPrimesCalculator_SetProgressCallbackFunc := LoadFunction ('libprimes_calculator_setprogresscallback'); FLibPrimesFactorizationCalculator_GetPrimeFactorsFunc := LoadFunction ('libprimes_factorizationcalculator_getprimefactors'); - FLibPrimesFactorizationCalculator_CheckPrimeFactorsFunc := LoadFunction ('libprimes_factorizationcalculator_checkprimefactors'); FLibPrimesSieveCalculator_GetPrimesFunc := LoadFunction ('libprimes_sievecalculator_getprimes'); - FLibPrimesCreateFactorizationCalculatorFunc := LoadFunction ('libprimes_createfactorizationcalculator'); - FLibPrimesCreateSieveCalculatorFunc := LoadFunction ('libprimes_createsievecalculator'); FLibPrimesReleaseInstanceFunc := LoadFunction ('libprimes_releaseinstance'); FLibPrimesGetLibraryVersionFunc := LoadFunction ('libprimes_getlibraryversion'); + FLibPrimesCreateFactorizationCalculatorFunc := LoadFunction ('libprimes_createfactorizationcalculator'); + FLibPrimesCreateSieveCalculatorFunc := LoadFunction ('libprimes_createsievecalculator'); FLibPrimesSetJournalFunc := LoadFunction ('libprimes_setjournal'); - CheckVersion(); + checkBinaryVersion(); end; destructor TLibPrimesWrapper.Destroy; @@ -597,7 +563,7 @@ implementation end; {$ENDIF MSWINDOWS} - procedure TLibPrimesWrapper.CheckVersion(); + procedure TLibPrimesWrapper.checkBinaryVersion(); var AMajor, AMinor, AMicro: Cardinal; begin @@ -606,6 +572,18 @@ implementation raise ELibPrimesException.Create(LIBPRIMES_ERROR_INCOMPATIBLEBINARYVERSION); end; + procedure TLibPrimesWrapper.ReleaseInstance(const AInstance: TLibPrimesBaseClass); + begin + if not Assigned (AInstance) then + raise ELibPrimesException.CreateCustomMessage (LIBPRIMES_ERROR_INVALIDPARAM, 'AInstance is a nil value.'); + CheckError (nil, LibPrimesReleaseInstanceFunc (AInstance.FHandle)); + end; + + procedure TLibPrimesWrapper.GetLibraryVersion(out AMajor: Cardinal; out AMinor: Cardinal; out AMicro: Cardinal); + begin + CheckError (nil, LibPrimesGetLibraryVersionFunc (AMajor, AMinor, AMicro)); + end; + function TLibPrimesWrapper.CreateFactorizationCalculator(): TLibPrimesFactorizationCalculator; var HInstance: TLibPrimesHandle; @@ -628,18 +606,6 @@ implementation Result := TLibPrimesSieveCalculator.Create (Self, HInstance); end; - procedure TLibPrimesWrapper.ReleaseInstance(const AInstance: TLibPrimesBaseClass); - begin - if not Assigned (AInstance) then - raise ELibPrimesException.CreateCustomMessage (LIBPRIMES_ERROR_INVALIDPARAM, 'AInstance is a nil value.'); - CheckError (nil, LibPrimesReleaseInstanceFunc (AInstance.FHandle)); - end; - - procedure TLibPrimesWrapper.GetLibraryVersion(out AMajor: Cardinal; out AMinor: Cardinal; out AMicro: Cardinal); - begin - CheckError (nil, LibPrimesGetLibraryVersionFunc (AMajor, AMinor, AMicro)); - end; - procedure TLibPrimesWrapper.SetJournal(const AFileName: String); begin CheckError (nil, LibPrimesSetJournalFunc (PAnsiChar (AFileName))); diff --git a/Examples/Primes/LibPrimes_component/Bindings/Python/LibPrimes.py b/Examples/Primes/LibPrimes_component/Bindings/Python/LibPrimes.py index 1b653deb..41a56a1d 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/Python/LibPrimes.py +++ b/Examples/Primes/LibPrimes_component/Bindings/Python/LibPrimes.py @@ -1,15 +1,15 @@ '''++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. Abstract: This is an autogenerated Python file in order to allow an easy - use of Prime Numbers Interface + use of Prime Numbers Library -Interface version: 1.3.0 +Interface version: 1.2.0 ''' @@ -34,7 +34,7 @@ def __str__(self): ''' class LibPrimesBindingVersion(enum.IntEnum): MAJOR = 1 - MINOR = 3 + MINOR = 2 MICRO = 0 '''Definition Error Codes @@ -95,22 +95,22 @@ def __init__(self, libraryName): self._loadFunctionTable() - self._checkVersion() + self._checkBinaryVersion() def _loadFunctionTable(self): try: - self.lib.libprimes_createfactorizationcalculator.restype = ctypes.c_int64 - self.lib.libprimes_createfactorizationcalculator.argtypes = [ctypes.POINTER(ctypes.c_void_p)] - - self.lib.libprimes_createsievecalculator.restype = ctypes.c_int64 - self.lib.libprimes_createsievecalculator.argtypes = [ctypes.POINTER(ctypes.c_void_p)] - self.lib.libprimes_releaseinstance.restype = ctypes.c_int64 self.lib.libprimes_releaseinstance.argtypes = [ctypes.c_void_p] self.lib.libprimes_getlibraryversion.restype = ctypes.c_int64 self.lib.libprimes_getlibraryversion.argtypes = [ctypes.POINTER(ctypes.c_uint32), ctypes.POINTER(ctypes.c_uint32), ctypes.POINTER(ctypes.c_uint32)] + self.lib.libprimes_createfactorizationcalculator.restype = ctypes.c_int64 + self.lib.libprimes_createfactorizationcalculator.argtypes = [ctypes.POINTER(ctypes.c_void_p)] + + self.lib.libprimes_createsievecalculator.restype = ctypes.c_int64 + self.lib.libprimes_createsievecalculator.argtypes = [ctypes.POINTER(ctypes.c_void_p)] + self.lib.libprimes_setjournal.restype = ctypes.c_int64 self.lib.libprimes_setjournal.argtypes = [ctypes.c_char_p] @@ -120,25 +120,22 @@ def _loadFunctionTable(self): self.lib.libprimes_calculator_setvalue.restype = ctypes.c_int64 self.lib.libprimes_calculator_setvalue.argtypes = [ctypes.c_void_p, ctypes.c_uint64] - self.lib.libprimes_calculator_setprogresscallback.restype = ctypes.c_int64 - self.lib.libprimes_calculator_setprogresscallback.argtypes = [ctypes.c_void_p, LibPrimesProgressCallback] - self.lib.libprimes_calculator_calculate.restype = ctypes.c_int64 self.lib.libprimes_calculator_calculate.argtypes = [ctypes.c_void_p] + self.lib.libprimes_calculator_setprogresscallback.restype = ctypes.c_int64 + self.lib.libprimes_calculator_setprogresscallback.argtypes = [ctypes.c_void_p, LibPrimesProgressCallback] + self.lib.libprimes_factorizationcalculator_getprimefactors.restype = ctypes.c_int64 self.lib.libprimes_factorizationcalculator_getprimefactors.argtypes = [ctypes.c_void_p, ctypes.c_uint64, ctypes.POINTER(ctypes.c_uint64), ctypes.POINTER(LibPrimesPrimeFactor)] - self.lib.libprimes_factorizationcalculator_checkprimefactors.restype = ctypes.c_int64 - self.lib.libprimes_factorizationcalculator_checkprimefactors.argtypes = [ctypes.c_void_p, ctypes.c_uint64, ctypes.POINTER(LibPrimesPrimeFactor), ctypes.POINTER(ctypes.c_bool)] - self.lib.libprimes_sievecalculator_getprimes.restype = ctypes.c_int64 self.lib.libprimes_sievecalculator_getprimes.argtypes = [ctypes.c_void_p, ctypes.c_uint64, ctypes.POINTER(ctypes.c_uint64), ctypes.POINTER(ctypes.c_uint64)] except AttributeError as ae: raise ELibPrimesException(LibPrimesErrorCodes.COULDNOTFINDLIBRARYEXPORT, ae.args[0]) - def _checkVersion(self): + def _checkBinaryVersion(self): nMajor, nMinor, _ = self.GetLibraryVersion() if (nMajor != LibPrimesBindingVersion.MAJOR) or (nMinor < LibPrimesBindingVersion.MINOR): raise ELibPrimesException(LibPrimesErrorCodes.INCOMPATIBLEBINARYVERSION) @@ -150,6 +147,16 @@ def checkError(self, instance, errorCode): if errorCode != LibPrimesErrorCodes.SUCCESS.value: raise ELibPrimesException(errorCode) + def ReleaseInstance(self, InstanceObject): + self.checkError(None, self.lib.libprimes_releaseinstance(InstanceObject._handle)) + + def GetLibraryVersion(self): + pMajor = ctypes.c_uint32() + pMinor = ctypes.c_uint32() + pMicro = ctypes.c_uint32() + self.checkError(None, self.lib.libprimes_getlibraryversion(pMajor, pMinor, pMicro)) + return pMajor.value, pMinor.value, pMicro.value + def CreateFactorizationCalculator(self): InstanceHandle = ctypes.c_void_p() self.checkError(None, self.lib.libprimes_createfactorizationcalculator(InstanceHandle)) @@ -162,16 +169,6 @@ def CreateSieveCalculator(self): InstanceObject = LibPrimesSieveCalculator(InstanceHandle, self) return InstanceObject - def ReleaseInstance(self, InstanceObject): - self.checkError(None, self.lib.libprimes_releaseinstance(InstanceObject._handle)) - - def GetLibraryVersion(self): - pMajor = ctypes.c_uint32() - pMinor = ctypes.c_uint32() - pMicro = ctypes.c_uint32() - self.checkError(None, self.lib.libprimes_getlibraryversion(pMajor, pMinor, pMicro)) - return pMajor.value, pMinor.value, pMicro.value - def SetJournal(self, FileName): pFileName = ctypes.c_char_p(str.encode(FileName)) self.checkError(None, self.lib.libprimes_setjournal(pFileName)) @@ -204,12 +201,12 @@ def SetValue(self, Value): nValue = ctypes.c_uint64(Value) self._wrapper.checkError(self, self._wrapper.lib.libprimes_calculator_setvalue(self._handle, nValue)) - def SetProgressCallback(self, ProgressCallbackFunc): - self._wrapper.checkError(self, self._wrapper.lib.libprimes_calculator_setprogresscallback(self._handle, ProgressCallbackFunc)) - def Calculate(self): self._wrapper.checkError(self, self._wrapper.lib.libprimes_calculator_calculate(self._handle)) + def SetProgressCallback(self, ProgressCallbackFunc): + self._wrapper.checkError(self, self._wrapper.lib.libprimes_calculator_setprogresscallback(self._handle, ProgressCallbackFunc)) + '''FactorizationCalculator Class Implementation @@ -228,13 +225,6 @@ def GetPrimeFactors(self): self._wrapper.checkError(self, self._wrapper.lib.libprimes_factorizationcalculator_getprimefactors(self._handle, nPrimeFactorsCount, nPrimeFactorsNeededCount, pPrimeFactorsBuffer)) return [pPrimeFactorsBuffer[i] for i in range(nPrimeFactorsNeededCount.value)] - def CheckPrimeFactors(self, PrimeFactors): - nPrimeFactorsCount = ctypes.c_uint64(len(PrimeFactors)) - pPrimeFactorsBuffer = (LibPrimesPrimeFactor*len(PrimeFactors))(*PrimeFactors) - pAreEqual = ctypes.c_bool() - self._wrapper.checkError(self, self._wrapper.lib.libprimes_factorizationcalculator_checkprimefactors(self._handle, nPrimeFactorsCount, pPrimeFactorsBuffer, pAreEqual)) - return pAreEqual.value - '''SieveCalculator Class Implementation diff --git a/Examples/Primes/LibPrimes_component/Examples/CPP/CMakeLists.txt b/Examples/Primes/LibPrimes_component/Examples/CPP/CMakeLists.txt index 10131494..50f1d761 100644 --- a/Examples/Primes/LibPrimes_component/Examples/CPP/CMakeLists.txt +++ b/Examples/Primes/LibPrimes_component/Examples/CPP/CMakeLists.txt @@ -1,15 +1,15 @@ #[[++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.0. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. Abstract: This is an autogenerated CMake Project that demonstrates the - usage of the C++ bindings of Prime Numbers Interface + usage of the C++ bindings of Prime Numbers Library -Interface version: 1.3.0 +Interface version: 1.2.0 ]] @@ -18,8 +18,8 @@ cmake_minimum_required(VERSION 3.5) project(LibPrimesExample_CPP) set (CMAKE_CXX_STANDARD 11) -link_directories("") # TODO: put the correct path of the import library here +link_directories("PATHTO_LibPrimes_component/Bindings/Cpp") # TODO: put the correct path of the import library here add_executable(LibPrimesExample_CPP "${CMAKE_CURRENT_SOURCE_DIR}/LibPrimes_example.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/../../Bindings/Cpp/libprimes.cpp") + "PATHTO_LibPrimes_component/Bindings/Cpp/libprimes.cpp") target_link_libraries(LibPrimesExample_CPP libprimes) -target_include_directories(LibPrimesExample_CPP PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../Bindings/Cpp") +target_include_directories(LibPrimesExample_CPP PRIVATE "PATHTO_LibPrimes_component/Bindings/Cpp") diff --git a/Examples/Primes/LibPrimes_component/Examples/CPP/LibPrimes_example.cpp b/Examples/Primes/LibPrimes_component/Examples/CPP/LibPrimes_example.cpp index 6577fc93..892caa8f 100644 --- a/Examples/Primes/LibPrimes_component/Examples/CPP/LibPrimes_example.cpp +++ b/Examples/Primes/LibPrimes_component/Examples/CPP/LibPrimes_example.cpp @@ -1,15 +1,15 @@ /*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.1. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. Abstract: This is an autogenerated C++ application that demonstrates the - usage of the C++ bindings of Prime Numbers Interface + usage of the C++ bindings of Prime Numbers Library -Interface version: 1.3.0 +Interface version: 1.2.0 */ diff --git a/Examples/Primes/LibPrimes_component/Examples/CppDynamic/LibPrimes_example.cpp b/Examples/Primes/LibPrimes_component/Examples/CppDynamic/LibPrimes_example.cpp index f1bec88e..e1b37717 100644 --- a/Examples/Primes/LibPrimes_component/Examples/CppDynamic/LibPrimes_example.cpp +++ b/Examples/Primes/LibPrimes_component/Examples/CppDynamic/LibPrimes_example.cpp @@ -47,11 +47,6 @@ int main() std::cout << pF.m_Prime << "^" << pF.m_Multiplicity << ((i < (primeFactors.size() - 1)) ? " * " : ""); } std::cout << std::endl; - - bool areEqual = factorization->CheckPrimeFactors(primeFactors); - if (!areEqual) { - std::cout << "Calculated prime factors are incorrect!"<< std::endl; - } } catch (std::exception &e) { diff --git a/Examples/Primes/LibPrimes_component/Examples/Python/LibPrimes_Example.py b/Examples/Primes/LibPrimes_component/Examples/Python/LibPrimes_Example.py index d90d6dc9..cad93b9f 100644 --- a/Examples/Primes/LibPrimes_component/Examples/Python/LibPrimes_Example.py +++ b/Examples/Primes/LibPrimes_component/Examples/Python/LibPrimes_Example.py @@ -10,17 +10,15 @@ ''' -def progressCallback(progress, shouldAbort): - print("Progress = {:d}%".format(round(progress*100))) - if (shouldAbort is not None): - shouldAbort[0] = progress > 0.5 - - import os import sys sys.path.append(os.path.join(os.path.realpath(__file__),"..", "..", "..", "Bindings", "Python")) import LibPrimes +def progressCallback(progress, shouldAbort): + print("Progress = {:d}%".format(round(progress*100))) + if (shouldAbort is not None): + shouldAbort[0] = progress > 0.5 def main(): libpath = '' # TODO add the location of the shared library binary here @@ -40,7 +38,7 @@ def main(): commaString = "" print("{:d}".format(primes[i]), end=commaString) print("]") - + factorization = wrapper.CreateFactorizationCalculator() factorization.SetValue(735) cTypesCallback = LibPrimes.LibPrimesProgressCallback(progressCallback) @@ -55,8 +53,6 @@ def main(): productString = "\n" print(" {:d}^{:d} ".format(pF.Prime, pF.Multiplicity), end=productString) - - if __name__ == "__main__": try: main() diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/CMakeLists.txt b/Examples/Primes/LibPrimes_component/Implementations/Cpp/CMakeLists.txt index 47e036c5..a938d89d 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/CMakeLists.txt +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/CMakeLists.txt @@ -4,7 +4,10 @@ Copyright (C) 2018 Automatic Component Toolkit Developers All rights reserved. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. + Abstract: This is an autogenerated CMakeLists file for the development of Prime Numbers Interface. + Interface version: 1.2.0 @@ -15,6 +18,8 @@ cmake_minimum_required(VERSION 3.5) ### The implementation of the Prime Numbers Interface component project(LibPrimes) +set (CMAKE_CXX_STANDARD 11) + # The location of autogenerated interfaces set(CMAKE_CURRENT_AUTOGENERATED_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Interfaces) @@ -24,17 +29,17 @@ file(GLOB LIBPRIMES_SRC file(GLOB LIBPRIMES_HDR ${CMAKE_CURRENT_SOURCE_DIR}/Stub/*.hpp ) -set(LIBPRIMES_SRC ${LIBPRIMES_SRC} +set(LIBPRIMES_SRC ${LIBPRIMES_SRC} ${LIBPRIMES_SRC} ${CMAKE_CURRENT_AUTOGENERATED_DIR}/libprimes_interfaceexception.cpp ${CMAKE_CURRENT_AUTOGENERATED_DIR}/libprimes_interfacewrapper.cpp ${CMAKE_CURRENT_AUTOGENERATED_DIR}/libprimes_interfacejournal.cpp ) -add_library(libprimes SHARED ${LIBPRIMES_SRC} ${LIBPRIMES_HDR}) -# This makes sure symbols are exported -target_compile_options(libprimes PRIVATE "-D__LIBPRIMES_EXPORTS") -# The following two properties are crucial to reduce the number of unwantedly exported symbols +add_library(libprimes SHARED ${LIBPRIMES_SRC}) +# The following two properties are crucial to reduce the number of undesirably exported symbols set_target_properties(libprimes PROPERTIES CXX_VISIBILITY_PRESET hidden) set_target_properties(libprimes PROPERTIES VISIBILITY_INLINES_HIDDEN ON) +# This makes sure symbols are exported +target_compile_options(libprimes PRIVATE "-D__LIBPRIMES_EXPORTS") target_include_directories(libprimes PRIVATE ${CMAKE_CURRENT_AUTOGENERATED_DIR}) target_include_directories(libprimes PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Stub) diff --git a/Examples/Primes/LibPrimes_component/Bindings/C/libprimes.h b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes.h similarity index 86% rename from Examples/Primes/LibPrimes_component/Bindings/C/libprimes.h rename to Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes.h index 175bce9e..08f6956b 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/C/libprimes.h +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes.h @@ -1,15 +1,15 @@ /*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. Abstract: This is an autogenerated plain C Header file in order to allow an easy - use of Prime Numbers Interface + use of Prime Numbers Library -Interface version: 1.3.0 +Interface version: 1.2.0 */ @@ -53,28 +53,28 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_getvalue(LibPrimes_Calcu LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_setvalue(LibPrimes_Calculator pCalculator, LibPrimes_uint64 nValue); /** -* Sets the progress callback function +* Performs the specific calculation of this Calculator * * @param[in] pCalculator - Calculator instance. -* @param[in] pProgressCallback - The progress callback * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_setprogresscallback(LibPrimes_Calculator pCalculator, LibPrimesProgressCallback pProgressCallback); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_calculate(LibPrimes_Calculator pCalculator); /** -* Performs the specific calculation of this Calculator +* Sets the progress callback function * * @param[in] pCalculator - Calculator instance. +* @param[in] pProgressCallback - The progress callback * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_calculate(LibPrimes_Calculator pCalculator); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_setprogresscallback(LibPrimes_Calculator pCalculator, LibPrimesProgressCallback pProgressCallback); /************************************************************************************************************************* Class definition for FactorizationCalculator **************************************************************************************************************************/ /** -* Returns the prime factors of this number (with multiplicity) +* Returns the prime factors of this number (without multiplicity) * * @param[in] pFactorizationCalculator - FactorizationCalculator instance. * @param[in] nPrimeFactorsBufferSize - Number of elements in buffer @@ -84,17 +84,6 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_calculate(LibPrimes_Calc */ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_factorizationcalculator_getprimefactors(LibPrimes_FactorizationCalculator pFactorizationCalculator, const LibPrimes_uint64 nPrimeFactorsBufferSize, LibPrimes_uint64* pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer); -/** -* Checks, whether a list of prime factors (with multiplicity) is the prime factor decomposistion of the calculator's value -* -* @param[in] pFactorizationCalculator - FactorizationCalculator instance. -* @param[in] nPrimeFactorsBufferSize - Number of elements in buffer -* @param[in] pPrimeFactorsBuffer - PrimeFactor buffer of -* @param[out] pAreEqual - Do the prime factors decompose this calculator's value -* @return error code or 0 (success) -*/ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_factorizationcalculator_checkprimefactors(LibPrimes_FactorizationCalculator pFactorizationCalculator, LibPrimes_uint64 nPrimeFactorsBufferSize, const sLibPrimesPrimeFactor * pPrimeFactorsBuffer, bool * pAreEqual); - /************************************************************************************************************************* Class definition for SieveCalculator **************************************************************************************************************************/ @@ -115,38 +104,38 @@ LIBPRIMES_DECLSPEC LibPrimesResult libprimes_sievecalculator_getprimes(LibPrimes **************************************************************************************************************************/ /** -* Creates a new FactorizationCalculator instance +* Releases the memory of an Instance * -* @param[out] pInstance - New FactorizationCalculator instance +* @param[in] pInstance - Instance Handle * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_createfactorizationcalculator(LibPrimes_FactorizationCalculator * pInstance); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_releaseinstance(LibPrimes_BaseClass pInstance); /** -* Creates a new SieveCalculator instance +* retrieves the current version of the library. * -* @param[out] pInstance - New SieveCalculator instance +* @param[out] pMajor - returns the major version of the library +* @param[out] pMinor - returns the minor version of the library +* @param[out] pMicro - returns the micro version of the library * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_createsievecalculator(LibPrimes_SieveCalculator * pInstance); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_getlibraryversion(LibPrimes_uint32 * pMajor, LibPrimes_uint32 * pMinor, LibPrimes_uint32 * pMicro); /** -* Releases the memory of an Instance +* Creates a new FactorizationCalculator instance * -* @param[in] pInstance - Instance Handle +* @param[out] pInstance - New FactorizationCalculator instance * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_releaseinstance(LibPrimes_BaseClass pInstance); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_createfactorizationcalculator(LibPrimes_FactorizationCalculator * pInstance); /** -* retrieves the current version of the library. +* Creates a new SieveCalculator instance * -* @param[out] pMajor - returns the major version of the library -* @param[out] pMinor - returns the minor version of the library -* @param[out] pMicro - returns the micro version of the library +* @param[out] pInstance - New SieveCalculator instance * @return error code or 0 (success) */ -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_getlibraryversion(LibPrimes_uint32 * pMajor, LibPrimes_uint32 * pMinor, LibPrimes_uint32 * pMicro); +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_createsievecalculator(LibPrimes_SieveCalculator * pInstance); /** * Handles Library Journaling diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.cpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.cpp new file mode 100644 index 00000000..6e08f9df --- /dev/null +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.cpp @@ -0,0 +1,39 @@ +/*++ + +Copyright (C) 2018 PrimeDevelopers + +All rights reserved. + +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. + +Abstract: This is an autogenerated C++ Implementation file with the basic internal + exception type in order to allow an easy use of Prime Numbers Library + +Interface version: 1.2.0 + +*/ + + +#include + +#include "libprimes_interfaceexception.hpp" + +/************************************************************************************************************************* + Class ELibPrimesInterfaceException +**************************************************************************************************************************/ +ELibPrimesInterfaceException::ELibPrimesInterfaceException(LibPrimesResult errorCode) + : m_errorMessage("LibPrimes Error " + std::to_string (errorCode)) +{ + m_errorCode = errorCode; +} + +LibPrimesResult ELibPrimesInterfaceException::getErrorCode () +{ + return m_errorCode; +} + +const char * ELibPrimesInterfaceException::what () const +{ + return m_errorMessage.c_str(); +} + diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.hpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.hpp new file mode 100644 index 00000000..c1450d91 --- /dev/null +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.hpp @@ -0,0 +1,55 @@ +/*++ + +Copyright (C) 2018 PrimeDevelopers + +All rights reserved. + +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. + +Abstract: This is an autogenerated C++ Header file with the basic internal + exception type in order to allow an easy use of Prime Numbers Library + +Interface version: 1.2.0 + +*/ + +#ifndef __LIBPRIMES_INTERFACEEXCEPTION_HEADER +#define __LIBPRIMES_INTERFACEEXCEPTION_HEADER + +#include +#include +#include "libprimes_types.h" + +/************************************************************************************************************************* + Class ELibPrimesInterfaceException +**************************************************************************************************************************/ + + +class ELibPrimesInterfaceException : public std::exception { +protected: + /** + * Error code for the Exception. + */ + LibPrimesResult m_errorCode; + /** + * Error message for the Exception. + */ + std::string m_errorMessage; + +public: + /** + * Exception Constructor. + */ + ELibPrimesInterfaceException (LibPrimesResult errorCode); + + /** + * Returns error code + */ + LibPrimesResult getErrorCode (); + /** + * Returns error message + */ + const char* what () const; +}; + +#endif // __LIBPRIMES_INTERFACEEXCEPTION_HEADER diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacejournal.cpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacejournal.cpp new file mode 100644 index 00000000..88ad8191 --- /dev/null +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacejournal.cpp @@ -0,0 +1,312 @@ +/*++ + +Copyright (C) 2018 PrimeDevelopers + +All rights reserved. + +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. + +Abstract: This is an autogenerated C++ implementation file in order to allow easy +development of Prime Numbers Library. It provides an automatic Journaling mechanism for the library implementation. + +Interface version: 1.2.0 + +*/ + + +#include +#include +#include + +#include "libprimes_interfacejournal.hpp" +#include "libprimes_interfaceexception.hpp" + + +std::string LibPrimesHandleToHex (LibPrimesHandle pHandle) +{ + std::stringstream stream; + stream << std::setfill('0') << std::setw(sizeof(LibPrimes_uint64) * 2) + << std::hex << (LibPrimes_uint64) pHandle; + return stream.str(); +} + +CLibPrimesInterfaceJournalEntry::CLibPrimesInterfaceJournalEntry(CLibPrimesInterfaceJournal * pJournal, std::string sClassName, std::string sMethodName, LibPrimesHandle pInstanceHandle) + : m_sClassName(sClassName), m_sMethodName(sMethodName), m_pJournal (pJournal), m_nInitTimeStamp (0), m_nFinishTimeStamp (0), m_ErrorCode (LIBPRIMES_SUCCESS) +{ + if (pJournal == nullptr) + throw ELibPrimesInterfaceException(LIBPRIMES_ERROR_INVALIDPARAM); + m_nInitTimeStamp = m_pJournal->getTimeStamp (); + m_sInstanceHandle = LibPrimesHandleToHex (pInstanceHandle); +} + +CLibPrimesInterfaceJournalEntry::~CLibPrimesInterfaceJournalEntry() +{ +} + +void CLibPrimesInterfaceJournalEntry::addParameter(const std::string & sName, const std::string & sParameterType, const std::string & sParameterValue) +{ + m_sParameters.push_back(std::make_pair(std::make_pair(sName, sParameterType), sParameterValue)); +} + +void CLibPrimesInterfaceJournalEntry::addResult(const std::string & sName, const std::string & sResultType, const std::string & sResultValue) +{ + m_sResultValues.push_back(std::make_pair(std::make_pair(sName, sResultType), sResultValue)); +} + +std::string CLibPrimesInterfaceJournalEntry::getXMLString() +{ + std::stringstream sStream; + LibPrimes_uint64 nDuration = 0; + + if (m_nFinishTimeStamp > m_nInitTimeStamp) + nDuration = m_nFinishTimeStamp - m_nInitTimeStamp; + + sStream << " \n"; + + if (m_sClassName != "") + sStream << " \n"; + + auto iParamIter = m_sParameters.begin(); + while (iParamIter != m_sParameters.end()) { + sStream << " first.first << "\" type=\"" << iParamIter->first.second << "\" value=\"" << iParamIter->second <<"\" />\n"; + iParamIter++; + } + + auto iResultIter = m_sResultValues.begin(); + while (iResultIter != m_sResultValues.end()) { + sStream << " first.first << "\" type=\"" << iResultIter->first.second << "\" value=\"" << iResultIter->second << "\" />\n"; + iResultIter++; + } + + sStream << " \n"; + return sStream.str (); +} + +void CLibPrimesInterfaceJournalEntry::writeSuccess() +{ + writeError(LIBPRIMES_SUCCESS); +} + +void CLibPrimesInterfaceJournalEntry::writeError(LibPrimesResult nErrorCode) +{ + m_ErrorCode = nErrorCode; + m_nFinishTimeStamp = m_pJournal->getTimeStamp(); + m_pJournal->writeEntry(this); +} + +void CLibPrimesInterfaceJournalEntry::addBooleanParameter(const std::string & sName, const bool bValue) +{ + addParameter (sName, "bool", std::to_string((int)bValue)); +} + +void CLibPrimesInterfaceJournalEntry::addUInt8Parameter(const std::string & sName, const LibPrimes_uint8 nValue) +{ + addParameter(sName, "uint8", std::to_string(nValue)); +} + +void CLibPrimesInterfaceJournalEntry::addUInt16Parameter(const std::string & sName, const LibPrimes_uint16 nValue) +{ + addParameter(sName, "uint16", std::to_string(nValue)); +} + +void CLibPrimesInterfaceJournalEntry::addUInt32Parameter(const std::string & sName, const LibPrimes_uint32 nValue) +{ + addParameter(sName, "uint32", std::to_string(nValue)); +} + +void CLibPrimesInterfaceJournalEntry::addUInt64Parameter(const std::string & sName, const LibPrimes_uint64 nValue) +{ + addParameter(sName, "uint64", std::to_string(nValue)); +} + +void CLibPrimesInterfaceJournalEntry::addInt8Parameter(const std::string & sName, const LibPrimes_int8 nValue) +{ + addParameter(sName, "int8", std::to_string(nValue)); +} + +void CLibPrimesInterfaceJournalEntry::addInt16Parameter(const std::string & sName, const LibPrimes_int16 nValue) +{ + addParameter(sName, "int16", std::to_string(nValue)); +} + +void CLibPrimesInterfaceJournalEntry::addInt32Parameter(const std::string & sName, const LibPrimes_int32 nValue) +{ + addParameter(sName, "uint32", std::to_string(nValue)); +} + +void CLibPrimesInterfaceJournalEntry::addInt64Parameter(const std::string & sName, const LibPrimes_int64 nValue) +{ + addParameter(sName, "int64", std::to_string(nValue)); +} + +void CLibPrimesInterfaceJournalEntry::addSingleParameter(const std::string & sName, const LibPrimes_single fValue) +{ + addParameter(sName, "single", std::to_string(fValue)); +} + +void CLibPrimesInterfaceJournalEntry::addDoubleParameter(const std::string & sName, const LibPrimes_double dValue) +{ + addParameter(sName, "double", std::to_string(dValue)); +} + +void CLibPrimesInterfaceJournalEntry::addStringParameter(const std::string & sName, const char * pValue) +{ + if (pValue != nullptr) { + addParameter(sName, "string", pValue); + } + else { + addParameter(sName, "nullstring", ""); + } +} + +void CLibPrimesInterfaceJournalEntry::addHandleParameter(const std::string & sName, const LibPrimesHandle pHandle) +{ + addParameter(sName, "handle", LibPrimesHandleToHex(pHandle)); +} + +void CLibPrimesInterfaceJournalEntry::addEnumParameter(const std::string & sName, const std::string & sEnumType, const LibPrimes_uint32 nValue) +{ + addParameter(sName, "enum" + sEnumType, std::to_string(nValue)); +} + +void CLibPrimesInterfaceJournalEntry::addBooleanResult(const std::string & sName, const bool bValue) +{ + addResult(sName, "bool", std::to_string((int)bValue)); +} + +void CLibPrimesInterfaceJournalEntry::addUInt8Result(const std::string & sName, const LibPrimes_uint8 nValue) +{ + addResult(sName, "uint8", std::to_string(nValue)); +} + +void CLibPrimesInterfaceJournalEntry::addUInt16Result(const std::string & sName, const LibPrimes_uint16 nValue) +{ + addResult(sName, "uint16", std::to_string(nValue)); +} + +void CLibPrimesInterfaceJournalEntry::addUInt32Result(const std::string & sName, const LibPrimes_uint32 nValue) +{ + addResult(sName, "uint32", std::to_string(nValue)); +} + +void CLibPrimesInterfaceJournalEntry::addUInt64Result(const std::string & sName, const LibPrimes_uint64 nValue) +{ + addResult(sName, "uint64", std::to_string(nValue)); +} + +void CLibPrimesInterfaceJournalEntry::addInt8Result(const std::string & sName, const LibPrimes_int8 nValue) +{ + addResult(sName, "int8", std::to_string(nValue)); +} + +void CLibPrimesInterfaceJournalEntry::addInt16Result(const std::string & sName, const LibPrimes_int16 nValue) +{ + addResult(sName, "int16", std::to_string(nValue)); +} + +void CLibPrimesInterfaceJournalEntry::addInt32Result(const std::string & sName, const LibPrimes_int32 nValue) +{ + addResult(sName, "uint32", std::to_string(nValue)); +} + +void CLibPrimesInterfaceJournalEntry::addInt64Result(const std::string & sName, const LibPrimes_int64 nValue) +{ + addResult(sName, "int64", std::to_string(nValue)); +} + +void CLibPrimesInterfaceJournalEntry::addSingleResult(const std::string & sName, const LibPrimes_single fValue) +{ + addResult(sName, "single", std::to_string(fValue)); +} + +void CLibPrimesInterfaceJournalEntry::addDoubleResult(const std::string & sName, const LibPrimes_double dValue) +{ + addResult(sName, "double", std::to_string(dValue)); +} + +void CLibPrimesInterfaceJournalEntry::addStringResult(const std::string & sName, const char * pValue) +{ + if (pValue != nullptr) { + addResult(sName, "string", pValue); + } + else { + addResult(sName, "nullstring", ""); + } +} + +void CLibPrimesInterfaceJournalEntry::addHandleResult(const std::string & sName, const LibPrimesHandle pHandle) +{ + addResult(sName, "handle", LibPrimesHandleToHex(pHandle)); +} + +void CLibPrimesInterfaceJournalEntry::addEnumResult(const std::string & sName, const std::string & sEnumType, const LibPrimes_uint32 nValue) +{ + addResult(sName, "enum" + sEnumType, std::to_string(nValue)); +} + + +CLibPrimesInterfaceJournal::CLibPrimesInterfaceJournal (const std::string & sFileName) + : m_sFileName (sFileName) +{ + m_StartTime = std::chrono::high_resolution_clock::now(); + m_Stream.open (sFileName, std::ios::out); + m_Stream << "\n"; + m_Stream << "\n"; + m_Stream << "\n"; + +} + +CLibPrimesInterfaceJournal::~CLibPrimesInterfaceJournal () +{ + m_Stream << "\n"; +} + +PLibPrimesInterfaceJournalEntry CLibPrimesInterfaceJournal::beginClassMethod(const LibPrimesHandle pHandle, const std::string & sClassName, const std::string & sMethodName) +{ + return std::make_shared(this, sClassName, sMethodName, pHandle); +} + +PLibPrimesInterfaceJournalEntry CLibPrimesInterfaceJournal::beginStaticFunction(const std::string & sMethodName) +{ + return std::make_shared(this, "", sMethodName, nullptr); +} + +void CLibPrimesInterfaceJournal::writeEntry (CLibPrimesInterfaceJournalEntry * pEntry) +{ + if (pEntry == nullptr) + throw ELibPrimesInterfaceException (LIBPRIMES_ERROR_INVALIDPARAM); + + std::string sXMLString = pEntry->getXMLString(); + m_Mutex.lock(); + try { + m_Stream << sXMLString; + m_Stream << "\n"; + + m_Mutex.unlock(); + } + catch (...) { + m_Mutex.unlock(); + } +} + +LibPrimes_uint64 CLibPrimesInterfaceJournal::getTimeStamp () +{ + auto currentTime = std::chrono::high_resolution_clock::now(); + if (m_StartTime < currentTime) { + auto duration = currentTime - m_StartTime; + auto milliSeconds = std::chrono::duration_cast (duration); + + return (LibPrimes_uint64) milliSeconds.count(); + } + else { + return 0; + } + +} + diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacejournal.hpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacejournal.hpp new file mode 100644 index 00000000..be4d16f2 --- /dev/null +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacejournal.hpp @@ -0,0 +1,120 @@ +/*++ + +Copyright (C) 2018 PrimeDevelopers + +All rights reserved. + +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. + +Abstract: This is an autogenerated C++ header file in order to allow easy +development of Prime Numbers Library. It provides an automatic Journaling mechanism for the library implementation. + +Interface version: 1.2.0 + +*/ + +#ifndef __LIBPRIMES_INTERFACEJOURNAL_HEADER +#define __LIBPRIMES_INTERFACEJOURNAL_HEADER + +#include +#include +#include +#include +#include +#include +#include +#include "libprimes_types.h" + +/************************************************************************************************************************* + Class CLibPrimesInterfaceJournal +**************************************************************************************************************************/ + +class CLibPrimesInterfaceJournal; + +class CLibPrimesInterfaceJournalEntry { + + protected: + + CLibPrimesInterfaceJournal * m_pJournal; + LibPrimesResult m_ErrorCode; + std::string m_sClassName; + std::string m_sMethodName; + std::string m_sInstanceHandle; + LibPrimes_uint64 m_nInitTimeStamp; + LibPrimes_uint64 m_nFinishTimeStamp; + std::list, std::string>> m_sParameters; + std::list, std::string>> m_sResultValues; + + std::string getXMLString(); + void addParameter (const std::string & sName, const std::string & sParameterType, const std::string & sParameterValue); + void addResult (const std::string & sName, const std::string & sResultType, const std::string & sResultValue); + + public: + CLibPrimesInterfaceJournalEntry(CLibPrimesInterfaceJournal * pJournal, std::string sClassName, std::string sMethodName, LibPrimesHandle pInstanceHandle); + ~CLibPrimesInterfaceJournalEntry(); + + void writeSuccess (); + void writeError (LibPrimesResult nErrorCode); + + void addBooleanParameter(const std::string & sName, const bool bValue); + void addUInt8Parameter(const std::string & sName, const LibPrimes_uint8 nValue); + void addUInt16Parameter(const std::string & sName, const LibPrimes_uint16 nValue); + void addUInt32Parameter(const std::string & sName, const LibPrimes_uint32 nValue); + void addUInt64Parameter(const std::string & sName, const LibPrimes_uint64 nValue); + void addInt8Parameter(const std::string & sName, const LibPrimes_int8 nValue); + void addInt16Parameter(const std::string & sName, const LibPrimes_int16 nValue); + void addInt32Parameter(const std::string & sName, const LibPrimes_int32 nValue); + void addInt64Parameter(const std::string & sName, const LibPrimes_int64 nValue); + void addSingleParameter(const std::string & sName, const LibPrimes_single fValue); + void addDoubleParameter(const std::string & sName, const LibPrimes_double dValue); + void addStringParameter(const std::string & sName, const char * pValue); + void addHandleParameter(const std::string & sName, const LibPrimesHandle pHandle); + void addEnumParameter(const std::string & sName, const std::string & sEnumType, const LibPrimes_uint32 nValue); + + void addBooleanResult(const std::string & sName, const bool bValue); + void addUInt8Result(const std::string & sName, const LibPrimes_uint8 nValue); + void addUInt16Result(const std::string & sName, const LibPrimes_uint16 nValue); + void addUInt32Result(const std::string & sName, const LibPrimes_uint32 nValue); + void addUInt64Result(const std::string & sName, const LibPrimes_uint64 nValue); + void addInt8Result(const std::string & sName, const LibPrimes_int8 nValue); + void addInt16Result(const std::string & sName, const LibPrimes_int16 nValue); + void addInt32Result(const std::string & sName, const LibPrimes_int32 nValue); + void addInt64Result(const std::string & sName, const LibPrimes_int64 nValue); + void addSingleResult(const std::string & sName, const LibPrimes_single fValue); + void addDoubleResult(const std::string & sName, const LibPrimes_double dValue); + void addStringResult(const std::string & sName, const char * pValue); + void addHandleResult(const std::string & sName, const LibPrimesHandle pHandle); + void addEnumResult(const std::string & sName, const std::string & sEnumType, const LibPrimes_uint32 nValue); + +friend class CLibPrimesInterfaceJournal; + +}; + +typedef std::shared_ptr PLibPrimesInterfaceJournalEntry; + + + +class CLibPrimesInterfaceJournal { + + protected: + + std::string m_sFileName; + std::mutex m_Mutex; + std::ofstream m_Stream; + std::chrono::time_point m_StartTime; + void writeEntry (CLibPrimesInterfaceJournalEntry * pEntry); + LibPrimes_uint64 getTimeStamp (); + + public: + + CLibPrimesInterfaceJournal (const std::string & sFileName); + ~CLibPrimesInterfaceJournal (); + PLibPrimesInterfaceJournalEntry beginClassMethod (const LibPrimesHandle pHandle, const std::string & sClassName, const std::string & sMethodName); + PLibPrimesInterfaceJournalEntry beginStaticFunction (const std::string & sMethodName); + friend class CLibPrimesInterfaceJournalEntry; +}; + +typedef std::shared_ptr PLibPrimesInterfaceJournal; + +#endif // __LIBPRIMES_INTERFACEJOURNAL_HEADER + diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaces.hpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaces.hpp new file mode 100644 index 00000000..dce9a1f8 --- /dev/null +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaces.hpp @@ -0,0 +1,152 @@ +/*++ + +Copyright (C) 2018 PrimeDevelopers + +All rights reserved. + +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. + +Abstract: This is an autogenerated C++ header file in order to allow easy +development of Prime Numbers Library. The implementer of Prime Numbers Library needs to +derive concrete classes from the abstract classes in this header. + +Interface version: 1.2.0 + +*/ + + +#ifndef __LIBPRIMES_CPPINTERFACES +#define __LIBPRIMES_CPPINTERFACES + +#include + +#include "libprimes_types.h" + +namespace LibPrimes { + +/** + Forward declarations of class interfaces +*/ +class ILibPrimesCalculator; +class ILibPrimesFactorizationCalculator; +class ILibPrimesSieveCalculator; + + +/************************************************************************************************************************* + Class ILibPrimesBaseClass +**************************************************************************************************************************/ + +class ILibPrimesBaseClass { +public: + virtual ~ILibPrimesBaseClass () {} +}; + + +/************************************************************************************************************************* + Class interface for LibPrimesCalculator +**************************************************************************************************************************/ + +class ILibPrimesCalculator : public virtual ILibPrimesBaseClass { +public: + /** + * ICalculator::GetValue - Returns the current value of this Calculator + * @return The current value of this Calculator + */ + virtual LibPrimes_uint64 GetValue () = 0; + + /** + * ICalculator::SetValue - Sets the value to be factorized + * @param[in] nValue - The value to be factorized + */ + virtual void SetValue (const LibPrimes_uint64 nValue) = 0; + + /** + * ICalculator::Calculate - Performs the specific calculation of this Calculator + */ + virtual void Calculate () = 0; + + /** + * ICalculator::SetProgressCallback - Sets the progress callback function + * @param[in] pProgressCallback - callback function + */ + virtual void SetProgressCallback (const LibPrimesProgressCallback pProgressCallback) = 0; + +}; + + +/************************************************************************************************************************* + Class interface for LibPrimesFactorizationCalculator +**************************************************************************************************************************/ + +class ILibPrimesFactorizationCalculator : public virtual ILibPrimesBaseClass, public virtual ILibPrimesCalculator { +public: + /** + * IFactorizationCalculator::GetPrimeFactors - Returns the prime factors of this number (without multiplicity) + * @param[in] nPrimeFactorsBufferSize - Number of elements in buffer + * @param[out] pPrimeFactorsNeededCount - will be filled with the count of the written structs, or needed buffer size. + * @param[out] pPrimeFactorsBuffer - PrimeFactor buffer of The prime factors of this number + */ + virtual void GetPrimeFactors (LibPrimes_uint64 nPrimeFactorsBufferSize, LibPrimes_uint64* pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer) = 0; + +}; + + +/************************************************************************************************************************* + Class interface for LibPrimesSieveCalculator +**************************************************************************************************************************/ + +class ILibPrimesSieveCalculator : public virtual ILibPrimesBaseClass, public virtual ILibPrimesCalculator { +public: + /** + * ISieveCalculator::GetPrimes - Returns all prime numbers lower or equal to the sieve's value + * @param[in] nPrimesBufferSize - Number of elements in buffer + * @param[out] pPrimesNeededCount - will be filled with the count of the written structs, or needed buffer size. + * @param[out] pPrimesBuffer - uint64 buffer of The primes lower or equal to the sieve's value + */ + virtual void GetPrimes (LibPrimes_uint64 nPrimesBufferSize, LibPrimes_uint64* pPrimesNeededCount, LibPrimes_uint64 * pPrimesBuffer) = 0; + +}; + + +/************************************************************************************************************************* + Global functions declarations +**************************************************************************************************************************/ +class CLibPrimesWrapper { +public: + /** + * Ilibprimes::ReleaseInstance - Releases the memory of an Instance + * @param[in] pInstance - Instance Handle + */ + static void ReleaseInstance (ILibPrimesBaseClass* pInstance); + + /** + * Ilibprimes::GetLibraryVersion - retrieves the current version of the library. + * @param[out] nMajor - returns the major version of the library + * @param[out] nMinor - returns the minor version of the library + * @param[out] nMicro - returns the micro version of the library + */ + static void GetLibraryVersion (LibPrimes_uint32 & nMajor, LibPrimes_uint32 & nMinor, LibPrimes_uint32 & nMicro); + + /** + * Ilibprimes::CreateFactorizationCalculator - Creates a new FactorizationCalculator instance + * @return New FactorizationCalculator instance + */ + static ILibPrimesFactorizationCalculator * CreateFactorizationCalculator (); + + /** + * Ilibprimes::CreateSieveCalculator - Creates a new SieveCalculator instance + * @return New SieveCalculator instance + */ + static ILibPrimesSieveCalculator * CreateSieveCalculator (); + + /** + * Ilibprimes::SetJournal - Handles Library Journaling + * @param[in] sFileName - Journal FileName + */ + static void SetJournal (const std::string & sFileName); + +}; + +} + +#endif // __LIBPRIMES_CPPINTERFACES diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacewrapper.cpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacewrapper.cpp new file mode 100644 index 00000000..a5fe44b2 --- /dev/null +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacewrapper.cpp @@ -0,0 +1,447 @@ +/*++ + +Copyright (C) 2018 PrimeDevelopers + +All rights reserved. + +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. + +Abstract: This is an autogenerated C++ implementation file in order to allow easy +development of Prime Numbers Library. The functions in this file need to be implemented. It needs to be generated only once. + +Interface version: 1.2.0 + +*/ + +#include "libprimes.h" +#include "libprimes_interfaces.hpp" +#include "libprimes_interfaceexception.hpp" +#include "libprimes_interfacejournal.hpp" + +using namespace LibPrimes; + +PLibPrimesInterfaceJournal m_GlobalJournal; + +extern "C" { + + +/************************************************************************************************************************* + Class implementation for Calculator +**************************************************************************************************************************/ +LibPrimesResult libprimes_calculator_getvalue (LibPrimes_Calculator pCalculator, LibPrimes_uint64 * pValue) +{ + PLibPrimesInterfaceJournalEntry pJournalEntry; + try { + if (m_GlobalJournal.get() != nullptr) { + pJournalEntry = m_GlobalJournal->beginClassMethod(pCalculator, "Calculator", "GetValue"); + } + + if (pValue == nullptr) + throw ELibPrimesInterfaceException (LIBPRIMES_ERROR_INVALIDPARAM); + + ILibPrimesBaseClass* pIBaseClass = (ILibPrimesBaseClass *)pCalculator; + ILibPrimesCalculator* pICalculator = dynamic_cast(pIBaseClass); + if (!pICalculator) + throw ELibPrimesInterfaceException(LIBPRIMES_ERROR_INVALIDCAST); + + + *pValue = pICalculator->GetValue(); + + + if (pJournalEntry.get() != nullptr) { + pJournalEntry->addUInt64Result ("Value", *pValue); + pJournalEntry->writeSuccess(); + } + + return LIBPRIMES_SUCCESS; + } + catch (ELibPrimesInterfaceException & E) { + if (pJournalEntry.get() != nullptr) + pJournalEntry->writeError(E.getErrorCode()); + return E.getErrorCode(); + } + catch (...) { + if (pJournalEntry.get() != nullptr) + pJournalEntry->writeError(LIBPRIMES_ERROR_GENERICEXCEPTION); + return LIBPRIMES_ERROR_GENERICEXCEPTION; + } +} + +LibPrimesResult libprimes_calculator_setvalue (LibPrimes_Calculator pCalculator, LibPrimes_uint64 nValue) +{ + PLibPrimesInterfaceJournalEntry pJournalEntry; + try { + if (m_GlobalJournal.get() != nullptr) { + pJournalEntry = m_GlobalJournal->beginClassMethod(pCalculator, "Calculator", "SetValue"); + pJournalEntry->addUInt64Parameter ("Value", nValue); + } + + + ILibPrimesBaseClass* pIBaseClass = (ILibPrimesBaseClass *)pCalculator; + ILibPrimesCalculator* pICalculator = dynamic_cast(pIBaseClass); + if (!pICalculator) + throw ELibPrimesInterfaceException(LIBPRIMES_ERROR_INVALIDCAST); + + + pICalculator->SetValue(nValue); + + + if (pJournalEntry.get() != nullptr) { + pJournalEntry->writeSuccess(); + } + + return LIBPRIMES_SUCCESS; + } + catch (ELibPrimesInterfaceException & E) { + if (pJournalEntry.get() != nullptr) + pJournalEntry->writeError(E.getErrorCode()); + return E.getErrorCode(); + } + catch (...) { + if (pJournalEntry.get() != nullptr) + pJournalEntry->writeError(LIBPRIMES_ERROR_GENERICEXCEPTION); + return LIBPRIMES_ERROR_GENERICEXCEPTION; + } +} + +LibPrimesResult libprimes_calculator_calculate (LibPrimes_Calculator pCalculator) +{ + PLibPrimesInterfaceJournalEntry pJournalEntry; + try { + if (m_GlobalJournal.get() != nullptr) { + pJournalEntry = m_GlobalJournal->beginClassMethod(pCalculator, "Calculator", "Calculate"); + } + + + ILibPrimesBaseClass* pIBaseClass = (ILibPrimesBaseClass *)pCalculator; + ILibPrimesCalculator* pICalculator = dynamic_cast(pIBaseClass); + if (!pICalculator) + throw ELibPrimesInterfaceException(LIBPRIMES_ERROR_INVALIDCAST); + + + pICalculator->Calculate(); + + + if (pJournalEntry.get() != nullptr) { + pJournalEntry->writeSuccess(); + } + + return LIBPRIMES_SUCCESS; + } + catch (ELibPrimesInterfaceException & E) { + if (pJournalEntry.get() != nullptr) + pJournalEntry->writeError(E.getErrorCode()); + return E.getErrorCode(); + } + catch (...) { + if (pJournalEntry.get() != nullptr) + pJournalEntry->writeError(LIBPRIMES_ERROR_GENERICEXCEPTION); + return LIBPRIMES_ERROR_GENERICEXCEPTION; + } +} + +LibPrimesResult libprimes_calculator_setprogresscallback (LibPrimes_Calculator pCalculator, LibPrimesProgressCallback pProgressCallback) +{ + PLibPrimesInterfaceJournalEntry pJournalEntry; + try { + if (m_GlobalJournal.get() != nullptr) { + pJournalEntry = m_GlobalJournal->beginClassMethod(pCalculator, "Calculator", "SetProgressCallback"); + } + + + ILibPrimesBaseClass* pIBaseClass = (ILibPrimesBaseClass *)pCalculator; + ILibPrimesCalculator* pICalculator = dynamic_cast(pIBaseClass); + if (!pICalculator) + throw ELibPrimesInterfaceException(LIBPRIMES_ERROR_INVALIDCAST); + + + pICalculator->SetProgressCallback(pProgressCallback); + + + if (pJournalEntry.get() != nullptr) { + pJournalEntry->writeSuccess(); + } + + return LIBPRIMES_SUCCESS; + } + catch (ELibPrimesInterfaceException & E) { + if (pJournalEntry.get() != nullptr) + pJournalEntry->writeError(E.getErrorCode()); + return E.getErrorCode(); + } + catch (...) { + if (pJournalEntry.get() != nullptr) + pJournalEntry->writeError(LIBPRIMES_ERROR_GENERICEXCEPTION); + return LIBPRIMES_ERROR_GENERICEXCEPTION; + } +} + + +/************************************************************************************************************************* + Class implementation for FactorizationCalculator +**************************************************************************************************************************/ +LibPrimesResult libprimes_factorizationcalculator_getprimefactors (LibPrimes_FactorizationCalculator pFactorizationCalculator, const LibPrimes_uint64 nPrimeFactorsBufferSize, LibPrimes_uint64* pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer) +{ + PLibPrimesInterfaceJournalEntry pJournalEntry; + try { + if (m_GlobalJournal.get() != nullptr) { + pJournalEntry = m_GlobalJournal->beginClassMethod(pFactorizationCalculator, "FactorizationCalculator", "GetPrimeFactors"); + } + + if ((!pPrimeFactorsBuffer) && !(pPrimeFactorsNeededCount)) + throw ELibPrimesInterfaceException (LIBPRIMES_ERROR_INVALIDPARAM); + + ILibPrimesBaseClass* pIBaseClass = (ILibPrimesBaseClass *)pFactorizationCalculator; + ILibPrimesFactorizationCalculator* pIFactorizationCalculator = dynamic_cast(pIBaseClass); + if (!pIFactorizationCalculator) + throw ELibPrimesInterfaceException(LIBPRIMES_ERROR_INVALIDCAST); + + + pIFactorizationCalculator->GetPrimeFactors(nPrimeFactorsBufferSize, pPrimeFactorsNeededCount, pPrimeFactorsBuffer); + + + if (pJournalEntry.get() != nullptr) { + pJournalEntry->writeSuccess(); + } + + return LIBPRIMES_SUCCESS; + } + catch (ELibPrimesInterfaceException & E) { + if (pJournalEntry.get() != nullptr) + pJournalEntry->writeError(E.getErrorCode()); + return E.getErrorCode(); + } + catch (...) { + if (pJournalEntry.get() != nullptr) + pJournalEntry->writeError(LIBPRIMES_ERROR_GENERICEXCEPTION); + return LIBPRIMES_ERROR_GENERICEXCEPTION; + } +} + + +/************************************************************************************************************************* + Class implementation for SieveCalculator +**************************************************************************************************************************/ +LibPrimesResult libprimes_sievecalculator_getprimes (LibPrimes_SieveCalculator pSieveCalculator, const LibPrimes_uint64 nPrimesBufferSize, LibPrimes_uint64* pPrimesNeededCount, LibPrimes_uint64 * pPrimesBuffer) +{ + PLibPrimesInterfaceJournalEntry pJournalEntry; + try { + if (m_GlobalJournal.get() != nullptr) { + pJournalEntry = m_GlobalJournal->beginClassMethod(pSieveCalculator, "SieveCalculator", "GetPrimes"); + } + + if ((!pPrimesBuffer) && !(pPrimesNeededCount)) + throw ELibPrimesInterfaceException (LIBPRIMES_ERROR_INVALIDPARAM); + + ILibPrimesBaseClass* pIBaseClass = (ILibPrimesBaseClass *)pSieveCalculator; + ILibPrimesSieveCalculator* pISieveCalculator = dynamic_cast(pIBaseClass); + if (!pISieveCalculator) + throw ELibPrimesInterfaceException(LIBPRIMES_ERROR_INVALIDCAST); + + + pISieveCalculator->GetPrimes(nPrimesBufferSize, pPrimesNeededCount, pPrimesBuffer); + + + if (pJournalEntry.get() != nullptr) { + pJournalEntry->writeSuccess(); + } + + return LIBPRIMES_SUCCESS; + } + catch (ELibPrimesInterfaceException & E) { + if (pJournalEntry.get() != nullptr) + pJournalEntry->writeError(E.getErrorCode()); + return E.getErrorCode(); + } + catch (...) { + if (pJournalEntry.get() != nullptr) + pJournalEntry->writeError(LIBPRIMES_ERROR_GENERICEXCEPTION); + return LIBPRIMES_ERROR_GENERICEXCEPTION; + } +} + + +/************************************************************************************************************************* + Global functions implementation +**************************************************************************************************************************/ +LibPrimesResult libprimes_releaseinstance (LibPrimes_BaseClass pInstance) +{ + PLibPrimesInterfaceJournalEntry pJournalEntry; + try { + if (m_GlobalJournal.get() != nullptr) { + pJournalEntry = m_GlobalJournal->beginStaticFunction("ReleaseInstance"); + pJournalEntry->addHandleParameter ("Instance", pInstance); + } + + + ILibPrimesBaseClass* pIBaseClassInstance = (ILibPrimesBaseClass *)pInstance; + ILibPrimesBaseClass* pIInstance = dynamic_cast(pIBaseClassInstance); + if (!pIInstance) + throw ELibPrimesInterfaceException (LIBPRIMES_ERROR_INVALIDCAST); + + + CLibPrimesWrapper::ReleaseInstance(pIInstance); + + + if (pJournalEntry.get() != nullptr) { + pJournalEntry->writeSuccess(); + } + + return LIBPRIMES_SUCCESS; + } + catch (ELibPrimesInterfaceException & E) { + if (pJournalEntry.get() != nullptr) + pJournalEntry->writeError(E.getErrorCode()); + return E.getErrorCode(); + } + catch (...) { + if (pJournalEntry.get() != nullptr) + pJournalEntry->writeError(LIBPRIMES_ERROR_GENERICEXCEPTION); + return LIBPRIMES_ERROR_GENERICEXCEPTION; + } +} + +LibPrimesResult libprimes_getlibraryversion (LibPrimes_uint32 * pMajor, LibPrimes_uint32 * pMinor, LibPrimes_uint32 * pMicro) +{ + PLibPrimesInterfaceJournalEntry pJournalEntry; + try { + if (m_GlobalJournal.get() != nullptr) { + pJournalEntry = m_GlobalJournal->beginStaticFunction("GetLibraryVersion"); + } + + if (!pMajor) + throw ELibPrimesInterfaceException (LIBPRIMES_ERROR_INVALIDPARAM); + if (!pMinor) + throw ELibPrimesInterfaceException (LIBPRIMES_ERROR_INVALIDPARAM); + if (!pMicro) + throw ELibPrimesInterfaceException (LIBPRIMES_ERROR_INVALIDPARAM); + + LibPrimes_uint32 nMajor; + LibPrimes_uint32 nMinor; + LibPrimes_uint32 nMicro; + + CLibPrimesWrapper::GetLibraryVersion(nMajor, nMinor, nMicro); + + *pMajor = nMajor; + *pMinor = nMinor; + *pMicro = nMicro; + + if (pJournalEntry.get() != nullptr) { + pJournalEntry->addUInt32Result ("Major", *pMajor); + pJournalEntry->addUInt32Result ("Minor", *pMinor); + pJournalEntry->addUInt32Result ("Micro", *pMicro); + pJournalEntry->writeSuccess(); + } + + return LIBPRIMES_SUCCESS; + } + catch (ELibPrimesInterfaceException & E) { + if (pJournalEntry.get() != nullptr) + pJournalEntry->writeError(E.getErrorCode()); + return E.getErrorCode(); + } + catch (...) { + if (pJournalEntry.get() != nullptr) + pJournalEntry->writeError(LIBPRIMES_ERROR_GENERICEXCEPTION); + return LIBPRIMES_ERROR_GENERICEXCEPTION; + } +} + +LibPrimesResult libprimes_createfactorizationcalculator (LibPrimes_FactorizationCalculator * pInstance) +{ + PLibPrimesInterfaceJournalEntry pJournalEntry; + try { + if (m_GlobalJournal.get() != nullptr) { + pJournalEntry = m_GlobalJournal->beginStaticFunction("CreateFactorizationCalculator"); + } + + if (pInstance == nullptr) + throw ELibPrimesInterfaceException (LIBPRIMES_ERROR_INVALIDPARAM); + + ILibPrimesBaseClass* pBaseInstance(nullptr); + + pBaseInstance = CLibPrimesWrapper::CreateFactorizationCalculator(); + + *pInstance = (ILibPrimesBaseClass*)(pBaseInstance); + + if (pJournalEntry.get() != nullptr) { + pJournalEntry->addHandleResult ("Instance", *pInstance); + pJournalEntry->writeSuccess(); + } + + return LIBPRIMES_SUCCESS; + } + catch (ELibPrimesInterfaceException & E) { + if (pJournalEntry.get() != nullptr) + pJournalEntry->writeError(E.getErrorCode()); + return E.getErrorCode(); + } + catch (...) { + if (pJournalEntry.get() != nullptr) + pJournalEntry->writeError(LIBPRIMES_ERROR_GENERICEXCEPTION); + return LIBPRIMES_ERROR_GENERICEXCEPTION; + } +} + +LibPrimesResult libprimes_createsievecalculator (LibPrimes_SieveCalculator * pInstance) +{ + PLibPrimesInterfaceJournalEntry pJournalEntry; + try { + if (m_GlobalJournal.get() != nullptr) { + pJournalEntry = m_GlobalJournal->beginStaticFunction("CreateSieveCalculator"); + } + + if (pInstance == nullptr) + throw ELibPrimesInterfaceException (LIBPRIMES_ERROR_INVALIDPARAM); + + ILibPrimesBaseClass* pBaseInstance(nullptr); + + pBaseInstance = CLibPrimesWrapper::CreateSieveCalculator(); + + *pInstance = (ILibPrimesBaseClass*)(pBaseInstance); + + if (pJournalEntry.get() != nullptr) { + pJournalEntry->addHandleResult ("Instance", *pInstance); + pJournalEntry->writeSuccess(); + } + + return LIBPRIMES_SUCCESS; + } + catch (ELibPrimesInterfaceException & E) { + if (pJournalEntry.get() != nullptr) + pJournalEntry->writeError(E.getErrorCode()); + return E.getErrorCode(); + } + catch (...) { + if (pJournalEntry.get() != nullptr) + pJournalEntry->writeError(LIBPRIMES_ERROR_GENERICEXCEPTION); + return LIBPRIMES_ERROR_GENERICEXCEPTION; + } +} + +LibPrimesResult libprimes_setjournal (const char * pFileName) +{ + try { + if (pFileName == nullptr) + throw ELibPrimesInterfaceException (LIBPRIMES_ERROR_INVALIDPARAM); + + std::string sFileName(pFileName); + + m_GlobalJournal = nullptr; + if (sFileName != "") { + m_GlobalJournal = std::make_shared (sFileName); + } + + + return LIBPRIMES_SUCCESS; + } + catch (ELibPrimesInterfaceException & E) { + return E.getErrorCode(); + } + catch (...) { + return LIBPRIMES_ERROR_GENERICEXCEPTION; + } +} + +} + diff --git a/Examples/Primes/LibPrimes_component/Bindings/C/libprimes_types.h b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_types.h similarity index 95% rename from Examples/Primes/LibPrimes_component/Bindings/C/libprimes_types.h rename to Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_types.h index 1eb111f0..e8a5027e 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/C/libprimes_types.h +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_types.h @@ -1,15 +1,15 @@ /*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. Abstract: This is an autogenerated plain C Header file with basic types in -order to allow an easy use of Prime Numbers Interface +order to allow an easy use of Prime Numbers Library -Interface version: 1.3.0 +Interface version: 1.2.0 */ @@ -61,7 +61,7 @@ typedef void * LibPrimesHandle; **************************************************************************************************************************/ #define LIBPRIMES_VERSION_MAJOR 1 -#define LIBPRIMES_VERSION_MINOR 3 +#define LIBPRIMES_VERSION_MINOR 2 #define LIBPRIMES_VERSION_MICRO 0 /************************************************************************************************************************* diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes.cpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes.cpp index dc0d9c46..f4425dce 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes.cpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes.cpp @@ -6,7 +6,6 @@ All rights reserved. Abstract: This is an autogenerated C++ implementation file in order to allow easy development of Prime Numbers Interface. It needs to be generated only once. -Interface version: 1.0.0 */ diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.cpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.cpp index e517aa14..66c92d66 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.cpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.cpp @@ -24,8 +24,8 @@ void CLibPrimesFactorizationCalculator::Calculate() { primeFactors.clear(); - unsigned long long nValue = m_value; - for (unsigned long long i = 2; i <= nValue; i++) { + LibPrimes_uint64 nValue = m_value; + for (LibPrimes_uint64 i = 2; i <= nValue; i++) { if (m_Callback) { bool shouldAbort = false; @@ -66,8 +66,3 @@ void CLibPrimesFactorizationCalculator::GetPrimeFactors (LibPrimes_uint64 nPrime } } -bool CLibPrimesFactorizationCalculator::CheckPrimeFactors(const LibPrimes_uint64 nPrimeFactorsBufferSize, const sLibPrimesPrimeFactor * pPrimeFactorsBuffer) -{ - throw ELibPrimesInterfaceException(LIBPRIMES_ERROR_NOTIMPLEMENTED); -} - diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.hpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.hpp index 5f5d6e70..316acb3e 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.hpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.hpp @@ -53,8 +53,6 @@ class CLibPrimesFactorizationCalculator : public virtual ILibPrimesFactorization */ void GetPrimeFactors (LibPrimes_uint64 nPrimeFactorsBufferSize, LibPrimes_uint64 * pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer); - - bool CheckPrimeFactors (const LibPrimes_uint64 nPrimeFactorsBufferSize, const sLibPrimesPrimeFactor * pPrimeFactorsBuffer); }; } diff --git a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes.lpr b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes.lpr index cbd3c5f5..1af0d311 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes.lpr +++ b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes.lpr @@ -1,15 +1,15 @@ (*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.1. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. Abstract: This is an autogenerated Pascal project file in order to allow easy -development of Prime Numbers Interface. +development of Prime Numbers Library. -Interface version: 1.3.0 +Interface version: 1.2.0 *) @@ -29,15 +29,14 @@ exports libprimes_calculator_getvalue, libprimes_calculator_setvalue, - libprimes_calculator_setprogresscallback, libprimes_calculator_calculate, + libprimes_calculator_setprogresscallback, libprimes_factorizationcalculator_getprimefactors, - libprimes_factorizationcalculator_checkprimefactors, libprimes_sievecalculator_getprimes, - libprimes_createfactorizationcalculator, - libprimes_createsievecalculator, libprimes_releaseinstance, libprimes_getlibraryversion, + libprimes_createfactorizationcalculator, + libprimes_createsievecalculator, libprimes_setjournal; begin diff --git a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_exception.pas b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_exception.pas index 6afa6a3e..5bf79d6e 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_exception.pas +++ b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_exception.pas @@ -1,15 +1,15 @@ (*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.1. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. Abstract: This is an autogenerated Pascal exception class definition file in order to allow easy -development of Prime Numbers Interface. The functions in this file need to be implemented. It needs to be generated only once. +development of Prime Numbers Library. The functions in this file need to be implemented. It needs to be generated only once. -Interface version: 1.3.0 +Interface version: 1.2.0 *) @@ -51,13 +51,14 @@ implementation LIBPRIMES_ERROR_GENERICEXCEPTION: ADescription := 'a generic exception occurred'; LIBPRIMES_ERROR_COULDNOTLOADLIBRARY: ADescription := 'the library could not be loaded'; LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT: ADescription := 'a required exported symbol could not be found in the library'; + LIBPRIMES_ERROR_INCOMPATIBLEBINARYVERSION: ADescription := 'the version of the binary interface does not match the bindings interface'; LIBPRIMES_ERROR_NORESULTAVAILABLE: ADescription := 'no result is available'; LIBPRIMES_ERROR_CALCULATIONABORTED: ADescription := 'a calculation has been aborted'; else ADescription := 'unknown'; end; - inherited Create (Format ('Prime Numbers Interface Error - %s (#%d)', [ ADescription, AErrorCode ])); + inherited Create (Format ('Prime Numbers Library Error - %s (#%d)', [ ADescription, AErrorCode ])); end; constructor ELibPrimesException.CreateCustomMessage (AErrorCode: TLibPrimesResult; AMessage: String); diff --git a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_exports.pas b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_exports.pas index aca22b5f..438e35d7 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_exports.pas +++ b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_exports.pas @@ -1,15 +1,15 @@ (*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.1. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. Abstract: This is an autogenerated Pascal export implementation file in order to allow easy -development of Prime Numbers Interface. The functions in this file need to be implemented. It needs to be generated only once. +development of Prime Numbers Library. The functions in this file need to be implemented. It needs to be generated only once. -Interface version: 1.3.0 +Interface version: 1.2.0 *) @@ -49,28 +49,28 @@ function libprimes_calculator_getvalue (pCalculator: TLibPrimesHandle; pValue: P function libprimes_calculator_setvalue (pCalculator: TLibPrimesHandle; nValue: QWord): TLibPrimesResult; cdecl; (** -* Sets the progress callback function +* Performs the specific calculation of this Calculator * * @param[in] pCalculator - Calculator instance. -* @param[in] pProgressCallback - The progress callback * @return error code or 0 (success) *) -function libprimes_calculator_setprogresscallback (pCalculator: TLibPrimesHandle; pProgressCallback: PLibPrimes_ProgressCallback): TLibPrimesResult; cdecl; +function libprimes_calculator_calculate (pCalculator: TLibPrimesHandle): TLibPrimesResult; cdecl; (** -* Performs the specific calculation of this Calculator +* Sets the progress callback function * * @param[in] pCalculator - Calculator instance. +* @param[in] pProgressCallback - The progress callback * @return error code or 0 (success) *) -function libprimes_calculator_calculate (pCalculator: TLibPrimesHandle): TLibPrimesResult; cdecl; +function libprimes_calculator_setprogresscallback (pCalculator: TLibPrimesHandle; pProgressCallback: PLibPrimes_ProgressCallback): TLibPrimesResult; cdecl; (************************************************************************************************************************* Class export definition of FactorizationCalculator **************************************************************************************************************************) (** -* Returns the prime factors of this number (with multiplicity) +* Returns the prime factors of this number (without multiplicity) * * @param[in] pFactorizationCalculator - FactorizationCalculator instance. * @param[in] nPrimeFactorsCount - Number of elements in buffer @@ -80,17 +80,6 @@ function libprimes_calculator_calculate (pCalculator: TLibPrimesHandle): TLibPri *) function libprimes_factorizationcalculator_getprimefactors (pFactorizationCalculator: TLibPrimesHandle; nPrimeFactorsCount: QWord; pPrimeFactorsNeededCount: PQWord; pPrimeFactorsBuffer: PLibPrimesPrimeFactor): TLibPrimesResult; cdecl; -(** -* Checks, whether a list of prime factors (with multiplicity) is the prime factor decomposistion of the calculator's value -* -* @param[in] pFactorizationCalculator - FactorizationCalculator instance. -* @param[in] nPrimeFactorsCount - Number of elements in buffer -* @param[in] pPrimeFactorsBuffer - PrimeFactor buffer of -* @param[out] pAreEqual - Do the prime factors decompose this calculator's value -* @return error code or 0 (success) -*) -function libprimes_factorizationcalculator_checkprimefactors (pFactorizationCalculator: TLibPrimesHandle; nPrimeFactorsCount: QWord; pPrimeFactorsBuffer: PLibPrimesPrimeFactor; pAreEqual: PCardinal): TLibPrimesResult; cdecl; - (************************************************************************************************************************* Class export definition of SieveCalculator **************************************************************************************************************************) @@ -111,38 +100,38 @@ function libprimes_sievecalculator_getprimes (pSieveCalculator: TLibPrimesHandle **************************************************************************************************************************) (** -* Creates a new FactorizationCalculator instance +* Releases the memory of an Instance * -* @param[out] pInstance - New FactorizationCalculator instance +* @param[in] pInstance - Instance Handle * @return error code or 0 (success) *) -function libprimes_createfactorizationcalculator (pInstance: PLibPrimesHandle): TLibPrimesResult; cdecl; +function libprimes_releaseinstance (pInstance: TLibPrimesHandle): TLibPrimesResult; cdecl; (** -* Creates a new SieveCalculator instance +* retrieves the current version of the library. * -* @param[out] pInstance - New SieveCalculator instance +* @param[out] pMajor - returns the major version of the library +* @param[out] pMinor - returns the minor version of the library +* @param[out] pMicro - returns the micro version of the library * @return error code or 0 (success) *) -function libprimes_createsievecalculator (pInstance: PLibPrimesHandle): TLibPrimesResult; cdecl; +function libprimes_getlibraryversion (pMajor: PCardinal; pMinor: PCardinal; pMicro: PCardinal): TLibPrimesResult; cdecl; (** -* Releases the memory of an Instance +* Creates a new FactorizationCalculator instance * -* @param[in] pInstance - Instance Handle +* @param[out] pInstance - New FactorizationCalculator instance * @return error code or 0 (success) *) -function libprimes_releaseinstance (pInstance: TLibPrimesHandle): TLibPrimesResult; cdecl; +function libprimes_createfactorizationcalculator (pInstance: PLibPrimesHandle): TLibPrimesResult; cdecl; (** -* retrieves the current version of the library. +* Creates a new SieveCalculator instance * -* @param[out] pMajor - returns the major version of the library -* @param[out] pMinor - returns the minor version of the library -* @param[out] pMicro - returns the micro version of the library +* @param[out] pInstance - New SieveCalculator instance * @return error code or 0 (success) *) -function libprimes_getlibraryversion (pMajor: PCardinal; pMinor: PCardinal; pMicro: PCardinal): TLibPrimesResult; cdecl; +function libprimes_createsievecalculator (pInstance: PLibPrimesHandle): TLibPrimesResult; cdecl; (** * Handles Library Journaling @@ -214,7 +203,7 @@ function libprimes_calculator_setvalue (pCalculator: TLibPrimesHandle; nValue: Q end; end; -function libprimes_calculator_setprogresscallback (pCalculator: TLibPrimesHandle; pProgressCallback: PLibPrimes_ProgressCallback): TLibPrimesResult; cdecl; +function libprimes_calculator_calculate (pCalculator: TLibPrimesHandle): TLibPrimesResult; cdecl; var ObjectCalculator: TObject; IntfCalculator: ILibPrimesCalculator; @@ -226,7 +215,7 @@ function libprimes_calculator_setprogresscallback (pCalculator: TLibPrimesHandle ObjectCalculator := TObject (pCalculator); if Supports (ObjectCalculator, ILibPrimesCalculator) then begin IntfCalculator := ObjectCalculator as ILibPrimesCalculator; - IntfCalculator.SetProgressCallback(pProgressCallback); + IntfCalculator.Calculate(); end else raise ELibPrimesException.Create (LIBPRIMES_ERROR_INVALIDCAST); @@ -242,7 +231,7 @@ function libprimes_calculator_setprogresscallback (pCalculator: TLibPrimesHandle end; end; -function libprimes_calculator_calculate (pCalculator: TLibPrimesHandle): TLibPrimesResult; cdecl; +function libprimes_calculator_setprogresscallback (pCalculator: TLibPrimesHandle; pProgressCallback: PLibPrimes_ProgressCallback): TLibPrimesResult; cdecl; var ObjectCalculator: TObject; IntfCalculator: ILibPrimesCalculator; @@ -254,7 +243,7 @@ function libprimes_calculator_calculate (pCalculator: TLibPrimesHandle): TLibPri ObjectCalculator := TObject (pCalculator); if Supports (ObjectCalculator, ILibPrimesCalculator) then begin IntfCalculator := ObjectCalculator as ILibPrimesCalculator; - IntfCalculator.Calculate(); + IntfCalculator.SetProgressCallback(pProgressCallback); end else raise ELibPrimesException.Create (LIBPRIMES_ERROR_INVALIDCAST); @@ -300,40 +289,6 @@ function libprimes_factorizationcalculator_getprimefactors (pFactorizationCalcul end; end; -function libprimes_factorizationcalculator_checkprimefactors (pFactorizationCalculator: TLibPrimesHandle; nPrimeFactorsCount: QWord; pPrimeFactorsBuffer: PLibPrimesPrimeFactor; pAreEqual: PCardinal): TLibPrimesResult; cdecl; -var - ResultAreEqual: Boolean; - ObjectFactorizationCalculator: TObject; - IntfFactorizationCalculator: ILibPrimesFactorizationCalculator; -begin - try - if ((not Assigned (pPrimeFactorsBuffer)) and (nPrimeFactorsCount>0)) then - raise ELibPrimesException.Create (LIBPRIMES_ERROR_INVALIDPARAM); - if not Assigned (pAreEqual) then - raise ELibPrimesException.Create (LIBPRIMES_ERROR_INVALIDPARAM); - if not Assigned (pFactorizationCalculator) then - raise ELibPrimesException.Create (LIBPRIMES_ERROR_INVALIDPARAM); - - ObjectFactorizationCalculator := TObject (pFactorizationCalculator); - if Supports (ObjectFactorizationCalculator, ILibPrimesFactorizationCalculator) then begin - IntfFactorizationCalculator := ObjectFactorizationCalculator as ILibPrimesFactorizationCalculator; - ResultAreEqual := IntfFactorizationCalculator.CheckPrimeFactors(nPrimeFactorsCount, pPrimeFactorsBuffer); - - pAreEqual^ := Ord (ResultAreEqual); - end else - raise ELibPrimesException.Create (LIBPRIMES_ERROR_INVALIDCAST); - - Result := LIBPRIMES_SUCCESS; - except - On E: ELibPrimesException do begin - Result := E.ErrorCode; - end; - On E: Exception do begin - Result := LIBPRIMES_ERROR_GENERICEXCEPTION; - end; - end; -end; - function libprimes_sievecalculator_getprimes (pSieveCalculator: TLibPrimesHandle; nPrimesCount: QWord; pPrimesNeededCount: PQWord; pPrimesBuffer: PQWord): TLibPrimesResult; cdecl; var ObjectSieveCalculator: TObject; @@ -364,17 +319,18 @@ function libprimes_sievecalculator_getprimes (pSieveCalculator: TLibPrimesHandle end; end; -function libprimes_createfactorizationcalculator (pInstance: PLibPrimesHandle): TLibPrimesResult; cdecl; +function libprimes_releaseinstance (pInstance: TLibPrimesHandle): TLibPrimesResult; cdecl; var - ResultInstance: TObject; + ObjectInstance: TObject; begin try - if not Assigned(pInstance) then - raise ELibPrimesException.Create (LIBPRIMES_ERROR_INVALIDPARAM); + ObjectInstance := TObject (pInstance); + if (not Supports (ObjectInstance, ILibPrimesBaseClass)) then + raise ELibPrimesException.Create (LIBPRIMES_ERROR_INVALIDCAST); + - ResultInstance := TLibPrimesWrapper.CreateFactorizationCalculator(); + TLibPrimesWrapper.ReleaseInstance(ObjectInstance); - pInstance^ := ResultInstance; Result := LIBPRIMES_SUCCESS; except On E: ELibPrimesException do begin @@ -386,17 +342,21 @@ function libprimes_createfactorizationcalculator (pInstance: PLibPrimesHandle): end; end; -function libprimes_createsievecalculator (pInstance: PLibPrimesHandle): TLibPrimesResult; cdecl; -var - ResultInstance: TObject; +function libprimes_getlibraryversion (pMajor: PCardinal; pMinor: PCardinal; pMicro: PCardinal): TLibPrimesResult; cdecl; begin try - if not Assigned(pInstance) then + if (not Assigned (pMajor)) then raise ELibPrimesException.Create (LIBPRIMES_ERROR_INVALIDPARAM); - ResultInstance := TLibPrimesWrapper.CreateSieveCalculator(); + if (not Assigned (pMinor)) then + raise ELibPrimesException.Create (LIBPRIMES_ERROR_INVALIDPARAM); + + if (not Assigned (pMicro)) then + raise ELibPrimesException.Create (LIBPRIMES_ERROR_INVALIDPARAM); + + + TLibPrimesWrapper.GetLibraryVersion(pMajor^, pMinor^, pMicro^); - pInstance^ := ResultInstance; Result := LIBPRIMES_SUCCESS; except On E: ELibPrimesException do begin @@ -408,18 +368,17 @@ function libprimes_createsievecalculator (pInstance: PLibPrimesHandle): TLibPrim end; end; -function libprimes_releaseinstance (pInstance: TLibPrimesHandle): TLibPrimesResult; cdecl; +function libprimes_createfactorizationcalculator (pInstance: PLibPrimesHandle): TLibPrimesResult; cdecl; var - ObjectInstance: TObject; + ResultInstance: TObject; begin try - ObjectInstance := TObject (pInstance); - if (not Supports (ObjectInstance, ILibPrimesBaseClass)) then - raise ELibPrimesException.Create (LIBPRIMES_ERROR_INVALIDCAST); - + if not Assigned(pInstance) then + raise ELibPrimesException.Create (LIBPRIMES_ERROR_INVALIDPARAM); - TLibPrimesWrapper.ReleaseInstance(ObjectInstance); + ResultInstance := TLibPrimesWrapper.CreateFactorizationCalculator(); + pInstance^ := ResultInstance; Result := LIBPRIMES_SUCCESS; except On E: ELibPrimesException do begin @@ -431,21 +390,17 @@ function libprimes_releaseinstance (pInstance: TLibPrimesHandle): TLibPrimesResu end; end; -function libprimes_getlibraryversion (pMajor: PCardinal; pMinor: PCardinal; pMicro: PCardinal): TLibPrimesResult; cdecl; +function libprimes_createsievecalculator (pInstance: PLibPrimesHandle): TLibPrimesResult; cdecl; +var + ResultInstance: TObject; begin try - if (not Assigned (pMajor)) then - raise ELibPrimesException.Create (LIBPRIMES_ERROR_INVALIDPARAM); - - if (not Assigned (pMinor)) then - raise ELibPrimesException.Create (LIBPRIMES_ERROR_INVALIDPARAM); - - if (not Assigned (pMicro)) then + if not Assigned(pInstance) then raise ELibPrimesException.Create (LIBPRIMES_ERROR_INVALIDPARAM); + ResultInstance := TLibPrimesWrapper.CreateSieveCalculator(); - TLibPrimesWrapper.GetLibraryVersion(pMajor^, pMinor^, pMicro^); - + pInstance^ := ResultInstance; Result := LIBPRIMES_SUCCESS; except On E: ELibPrimesException do begin diff --git a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_interfaces.pas b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_interfaces.pas index 57e6da64..0e35060c 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_interfaces.pas +++ b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_interfaces.pas @@ -1,15 +1,15 @@ (*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.1. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. Abstract: This is an autogenerated Pascal interface definition file in order to allow easy -development of Prime Numbers Interface. The functions in this file need to be implemented. It needs to be generated only once. +development of Prime Numbers Library. The functions in this file need to be implemented. It needs to be generated only once. -Interface version: 1.3.0 +Interface version: 1.2.0 *) @@ -44,8 +44,8 @@ interface function GetValue(): QWord; procedure SetValue(const AValue: QWord); - procedure SetProgressCallback(const AProgressCallback: PLibPrimes_ProgressCallback); procedure Calculate(); + procedure SetProgressCallback(const AProgressCallback: PLibPrimes_ProgressCallback); end; @@ -57,7 +57,6 @@ interface ['{81855AD8-681D-4D86-91E9-1E00167939CB}'] procedure GetPrimeFactors(const APrimeFactorsCount: QWord; PPrimeFactorsNeededCount: PQWord; APrimeFactors: PLibPrimesPrimeFactor); - function CheckPrimeFactors(const APrimeFactorsCount: QWord; const APrimeFactors: PLibPrimesPrimeFactor): Boolean; end; diff --git a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_types.pas b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_types.pas index 0f6d4f16..a5ee039b 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_types.pas +++ b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_types.pas @@ -1,15 +1,15 @@ (*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.1. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. Abstract: This is an autogenerated Pascal type definition file in order to allow easy -development of Prime Numbers Interface. The functions in this file need to be implemented. It needs to be generated only once. +development of Prime Numbers Library. The functions in this file need to be implemented. It needs to be generated only once. -Interface version: 1.3.0 +Interface version: 1.2.0 *) @@ -28,7 +28,7 @@ interface const LIBPRIMES_VERSION_MAJOR = 1; - LIBPRIMES_VERSION_MINOR = 3; + LIBPRIMES_VERSION_MINOR = 2; LIBPRIMES_VERSION_MICRO = 0; @@ -56,8 +56,9 @@ interface LIBPRIMES_ERROR_GENERICEXCEPTION = 5; LIBPRIMES_ERROR_COULDNOTLOADLIBRARY = 6; LIBPRIMES_ERROR_COULDNOTFINDLIBRARYEXPORT = 7; - LIBPRIMES_ERROR_NORESULTAVAILABLE = 8; - LIBPRIMES_ERROR_CALCULATIONABORTED = 9; + LIBPRIMES_ERROR_INCOMPATIBLEBINARYVERSION = 8; + LIBPRIMES_ERROR_NORESULTAVAILABLE = 9; + LIBPRIMES_ERROR_CALCULATIONABORTED = 10; (************************************************************************************************************************* Declaration of structs @@ -82,7 +83,9 @@ interface Declaration of function types **************************************************************************************************************************) - PLibPrimes_ProgressCallback = function(const fProgressPercentage: Single; out pShouldAbort: Cardinal): Integer; +type + + PLibPrimes_ProgressCallback = function(const fProgressPercentage: Single; out pShouldAbort: Cardinal): Integer; cdecl; implementation diff --git a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl_factorizationcalculator.pas b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl_factorizationcalculator.pas index b53efaae..519e04bf 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl_factorizationcalculator.pas +++ b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl_factorizationcalculator.pas @@ -29,7 +29,6 @@ TLibPrimesFactorizationCalculator = class (TLibPrimesCalculator, ILibPrimesFact public procedure GetPrimeFactors(const APrimeFactorsCount: QWord; PPrimeFactorsNeededCount: PQWord; APrimeFactors: PLibPrimesPrimeFactor); - function CheckPrimeFactors(const APrimeFactorsCount: QWord; const APrimeFactors: PLibPrimesPrimeFactor): Boolean; procedure Calculate(); override; destructor Destroy(); override; end; @@ -60,11 +59,6 @@ procedure TLibPrimesFactorizationCalculator.GetPrimeFactors(const APrimeFactorsC end; end; -function TLibPrimesFactorizationCalculator.CheckPrimeFactors(const APrimeFactorsCount: QWord; const APrimeFactors: PLibPrimesPrimeFactor): Boolean; -begin - raise ELibPrimesException.Create(LIBPRIMES_ERROR_NOTIMPLEMENTED); -end; - procedure TLibPrimesFactorizationCalculator.Calculate(); var AValue: QWord; diff --git a/Examples/Primes/LibPrimes_component/Implementations/Pascal/libprimes.def b/Examples/Primes/LibPrimes_component/Implementations/Pascal/libprimes.def new file mode 100644 index 00000000..babde722 --- /dev/null +++ b/Examples/Primes/LibPrimes_component/Implementations/Pascal/libprimes.def @@ -0,0 +1,12 @@ +EXPORTS +libprimes_releaseinstance +libprimes_getlibraryversion +libprimes_createfactorizationcalculator +libprimes_createsievecalculator +libprimes_setjournal +libprimes_calculator_getvalue +libprimes_calculator_setvalue +libprimes_calculator_calculate +libprimes_calculator_setprogresscallback +libprimes_factorizationcalculator_getprimefactors +libprimes_sievecalculator_getprimes diff --git a/Examples/Primes/LibPrimes_component/license.txt b/Examples/Primes/LibPrimes_component/license.txt new file mode 100644 index 00000000..f0a7288b --- /dev/null +++ b/Examples/Primes/LibPrimes_component/license.txt @@ -0,0 +1,5 @@ +Copyright (C) 2018 PrimeDevelopers + +All rights reserved. + + diff --git a/Examples/Primes/Tutorial.md b/Examples/Primes/Tutorial.md index 4c4ab4c9..d6e64a64 100644 --- a/Examples/Primes/Tutorial.md +++ b/Examples/Primes/Tutorial.md @@ -38,7 +38,7 @@ _There are much more efficient algorithms and more suitable software packages to # 2. Requirements - CMake - A C++ compiler / development environment. This tutorial was tested with Visual Studio 2017, but should also work with GCC and make - - ACT: This tutorial is tested to work with release 1.1.0 of ACT. You can get it from [the release page](https://github.com/Autodesk/AutomaticComponentToolkit/releases). + - ACT: This tutorial is tested to work with release 1.3.2 of ACT. You can get it from [the release page](https://github.com/Autodesk/AutomaticComponentToolkit/releases). Decide on a location for your tutorial's component to live in, and download the binary for your platform into this folder. @@ -64,8 +64,8 @@ First, copy the snippet, a bare-bone IDL-file, and save it into libPrimes.xml in - - + + @@ -76,6 +76,7 @@ First, copy the snippet, a bare-bone IDL-file, and save it into libPrimes.xml in + @@ -98,7 +99,7 @@ It's elements define the following: The errors listed in this snippet are required. -`\` defines the global functions that can be used as entry points into the component. It must contain a `versionmethod` and a `releasemethod` with the signatures in this snippet. -They will be explained in [](). +They will be explained in [this section](#331-required-steps-for-every-act-component). The syntax for methods will be explained when we add new classes and functions to the IDL-file now. @@ -158,7 +159,7 @@ Again, we will implement the actual calculation of primes by overwriting the the We want to use the error `LIBPRIMES_ERROR_NORESULTAVAILABLE` when a user tries to retrieve results from a calculator without having performed a calculation before. Thus add a new error ```xml - + ``` @@ -203,14 +204,14 @@ the interfaces `ILibPrimesCalculator` and `ILibPrimesFactorizationCalculator`: /*...*/ class ILibPrimesCalculator : public virtual ILibPrimesBaseClass { public: - virtual unsigned long long GetValue () = 0; - virtual void SetValue (const unsigned long long nValue) = 0; + virtual LibPrimes_uint64 long GetValue () = 0; + virtual void SetValue (const LibPrimes_uint64 nValue) = 0; virtual void Calculate () = 0; }; class ILibPrimesFactorizationCalculator : public virtual ILibPrimesBaseClass, public virtual ILibPrimesCalculator { public: - virtual void GetPrimeFactors (unsigned int nPrimeFactorsBufferSize, unsigned int * pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer) = 0; + virtual void GetPrimeFactors (LibPrimes_uint64 nPrimeFactorsBufferSize, LibPrimes_uint64 * pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer) = 0; }; /*...*/ ``` @@ -220,7 +221,7 @@ The `libprimes_interfaceexception.hpp` and `libprimes_interfaceexception.cpp` fi The `libprimes_interfacewrapper.cpp` file implements the forwarding of the C89-interface functions to the classes you will implement. It also translates all exceptions into error codes. ```cpp -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_getvalue (LibPrimes_Calculator pCalculator, unsigned long long * pValue) +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_getvalue (LibPrimes_Calculator pCalculator, LibPrimes_uint64 * pValue) { try { if (pValue == nullptr) @@ -254,14 +255,14 @@ They contain a concrete class definition derived from the corresponding interfac class CLibPrimesFactorizationCalculator : public virtual ILibPrimesFactorizationCalculator, public virtual CLibPrimesCalculator { public: void Calculate(); - void GetPrimeFactors (unsigned int nPrimeFactorsBufferSize, unsigned int * pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer); + void GetPrimeFactors (LibPrimes_uint64 nPrimeFactorsBufferSize, LibPrimes_uint64 * pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer); }; ``` The autogenerated implementation of each of a class's methods throws a `NOTIMPLEMENTED` exception: ```cpp -void CLibPrimesFactorizationCalculator::GetPrimeFactors (unsigned int nPrimeFactorsBufferSize, - unsigned int * pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer) +void CLibPrimesFactorizationCalculator::GetPrimeFactors (LibPrimes_uint64 nPrimeFactorsBufferSize, + LibPrimes_uint64 * pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer) { throw ELibPrimesInterfaceException(LIBPRIMES_ERROR_NOTIMPLEMENTED); } @@ -275,7 +276,7 @@ The following code snipped sets up a Visual Studio solution: cd LibPrimes_component/Implementation/ mkdir _build cd _build -cmake .. -G "Visual Studio 14 Win64" +cmake .. -G "Visual Studio 15 Win64" cmake --build . ``` Adjust the CMake-Generator for your development environment, if required. @@ -285,7 +286,7 @@ Now we can start actually implementing the library. ### 3.3.1. Required steps for every ACT component #### GetVersion function ```cpp -void CLibPrimesWrapper::GetLibraryVersion (unsigned int & nMajor, unsigned int & nMinor, unsigned int & nMicro) +void CLibPrimesWrapper::GetLibraryVersion (LibPrimes_uint32 & nMajor, LibPrimes_uint32 & nMinor, LibPrimes_uint32 & nMicro) { nMajor = LIBPRIMES_VERSION_MAJOR; nMinor = LIBPRIMES_VERSION_MINOR; @@ -336,18 +337,18 @@ Add a protected member `m_value` to the `CLibPrimesCalculator` ```cpp class CLibPrimesCalculator : public virtual ILibPrimesCalculator { protected: - unsined long long m_value; + LibPrimes_uint64 m_value; /*...*/ } ``` The `GetValue`/`SetValue` methods of the `Calculator` are straight-forward: ```cpp -unsigned long long CLibPrimesCalculator::GetValue() +LibPrimes_uint64 CLibPrimesCalculator::GetValue() { return m_value; } -void CLibPrimesCalculator::SetValue(const unsigned long long nValue) +void CLibPrimesCalculator::SetValue(const LibPrimes_uint64 nValue) { m_value = nValue; } @@ -372,8 +373,8 @@ public: A valid implementation of `GetPrimes` is the following ```cpp -void CLibPrimesFactorizationCalculator::GetPrimeFactors (unsigned int nPrimeFactorsBufferSize, - unsigned int * pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer) +void CLibPrimesFactorizationCalculator::GetPrimeFactors (LibPrimes_uint64 nPrimeFactorsBufferSize, + LibPrimes_uint64 * pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer) { if (primeFactors.size() == 0) throw ELibPrimesInterfaceException(LIBPRIMES_ERROR_NORESULTAVAILABLE); @@ -397,8 +398,8 @@ void CLibPrimesFactorizationCalculator::Calculate() { primeFactors.clear(); - unsigned long long nValue = m_value; - for (unsigned long long i = 2; i <= nValue; i++) { + LibPrimes_uint64 nValue = m_value; + for (LibPrimes_uint64 i = 2; i <= nValue; i++) { sLibPrimesPrimeFactor primeFactor; primeFactor.m_Prime = i; primeFactor.m_Multiplicity = 0; @@ -419,7 +420,7 @@ and a public `Calculate` method: ```cpp class CLibPrimesSieveCalculator : public virtual ILibPrimesSieveCalculator, public virtual CLibPrimesCalculator { private: - std::vector primes; + std::vector primes; public: void Calculate(); /*...*/ @@ -429,12 +430,12 @@ public: The `GetPrimes` method is analogous to the above `GetPrimeFactors` ```cpp void CLibPrimesSieveCalculator::GetPrimes (unsigned int nPrimesBufferSize, - unsigned int * pPrimesNeededCount, unsigned long long * pPrimesBuffer) + LibPrimes_uint64 * pPrimesNeededCount, LibPrimes_uint64 * pPrimesBuffer) { if (primes.size() == 0) throw ELibPrimesInterfaceException(LIBPRIMES_ERROR_NORESULTAVAILABLE); if (pPrimesNeededCount) - *pPrimesNeededCount = (unsigned int)primes.size(); + *pPrimesNeededCount = (LibPrimes_uint64)primes.size(); if (nPrimesBufferSize >= primes.size() && pPrimesBuffer) { for (int i = 0; i < primes.size(); i++) @@ -452,19 +453,19 @@ void CLibPrimesSieveCalculator::Calculate() primes.clear(); std::vector strikenOut(m_value + 1); - for (unsigned long long i = 0; i <= m_value; i++) { + for (LibPrimes_uint64 i = 0; i <= m_value; i++) { strikenOut[i] = i < 2; } - unsigned long sqrtValue = (unsigned long)(sqrt(m_value)); - for (unsigned long long i = 2; i <= sqrtValue; i++) { + LibPrimes_uint64 sqrtValue = (LibPrimes_uint64)(sqrt(m_value)); + for (LibPrimes_uint64 i = 2; i <= sqrtValue; i++) { if (!strikenOut[i]) { primes.push_back(i); - for (unsigned long long j = i * i; j < m_value; j += i) { + for (LibPrimes_uint64 j = i * i; j < m_value; j += i) { strikenOut[j] = true; } } } - for (unsigned long long i = sqrtValue; i <= m_value; i++) { + for (LibPrimes_uint64 i = sqrtValue; i <= m_value; i++) { if (!strikenOut[i]) { primes.push_back(i); } @@ -489,7 +490,7 @@ Generate a solution and build it cd LibPrimes_component/Examples/CppDynamic mkdir _build cd _build -cmake .. -G "Visual Studio 14 Win64" +cmake .. -G "Visual Studio 15 Win64" ``` You will have to modify the path to the binary library file we created in section [3. The Library's Implementation](#3-the-librarys-implementation). ```cpp @@ -498,20 +499,20 @@ You will have to modify the path to the binary library file we created in sectio int main() { - try - { - std::string libpath = (""); // TODO: put the location of the LibPrimes-library file here. - auto wrapper = LibPrimes::CLibPrimesWrapper::loadLibrary(libpath + "/libprimes"); - unsigned int nMajor, nMinor, nMicro; - wrapper->GetLibraryVersion(nMajor, nMinor, nMicro); - std::cout << "LibPrimes.Version = " << nMajor << "." << nMinor << "." << nMicro << std::endl; - } - catch (std::exception &e) - { - std::cout << e.what() << std::endl; - return 1; - } - return 0; + try + { + std::string libpath = (""); // TODO: put the location of the LibPrimes-library file here. + auto wrapper = LibPrimes::CLibPrimesWrapper::loadLibrary(libpath + "/libprimes."); // TODO: add correct suffix of the library + unsigned int nMajor, nMinor, nMicro; + wrapper->GetLibraryVersion(nMajor, nMinor, nMicro); + std::cout << "LibPrimes.Version = " << nMajor << "." << nMinor << "." << nMicro << std::endl; + } + catch (std::exception &e) + { + std::cout << e.what() << std::endl; + return 1; + } + return 0; } ``` Now build the solution @@ -550,8 +551,8 @@ e.g. a C++ function call is forwarded to the C-interface as follows ```cpp void GetPrimeFactors (std::vector & PrimeFactorsBuffer) { - unsigned int elementsNeededPrimeFactors = 0; - unsigned int elementsWrittenPrimeFactors = 0; + LibPrimes_uint64 elementsNeededPrimeFactors = 0; + LibPrimes_uint64 elementsWrittenPrimeFactors = 0; CheckError ( m_pWrapper->m_WrapperTable.m_FactorizationCalculator_GetPrimeFactors (m_pHandle, 0, &elementsNeededPrimeFactors, nullptr) ); PrimeFactorsBuffer.resize(elementsNeededPrimeFactors); CheckError ( m_pWrapper->m_WrapperTable.m_FactorizationCalculator_GetPrimeFactors (m_pHandle, elementsNeededPrimeFactors, &elementsWrittenPrimeFactors, PrimeFactorsBuffer.data()) ); @@ -711,7 +712,7 @@ Then add a method to the `Calculator` class that sets the progress callback: We will handle aborted calculations via a new exceptions, which a client can handle. Thus, add a new `\`: ```xml - + ``` In the [semantic versioning scheme](https://semver.org/), which is advocated by ACT, adding a new function to a components class @@ -736,7 +737,7 @@ function type and their usage is declared: /************************************************************************************************************************* Declaration of function pointers **************************************************************************************************************************/ -typedef void(*LibPrimesProgressCallback)(float, bool*); +typedef void(*LibPrimesProgressCallback)(LibPrimes_single, bool*); ``` ```cpp class ILibPrimesCalculator : public virtual ILibPrimesBaseClass { @@ -784,8 +785,8 @@ void CLibPrimesFactorizationCalculator::Calculate() { primeFactors.clear(); - unsigned long long nValue = m_value; - for (unsigned long long i = 2; i <= nValue; i++) { + LibPrimes_uint64 nValue = m_value; + for (LibPrimes_uint64 i = 2; i <= nValue; i++) { if (m_Callback) { bool shouldAbort = false; @@ -824,7 +825,7 @@ as their respective language bindings have already been updated at the end of st Open the solution from [Section 4.1](#41-cpp-dynamic), and add a concrete implementation of the "LibPrimesProgressCallback" function-type: ```cpp -void progressCallback(float progress, bool* shouldAbort) +void progressCallback(LibPrimes_single progress, bool* shouldAbort) { std::cout << "Progress = " << round(progress * 100) << "%" << std::endl; if (shouldAbort) { @@ -851,9 +852,9 @@ LibPrimes.Version = 1.1.0 Progress = 0% Progress = 0% Progress = 67% -LibPrimes Error 9 +LibPrimes Error 10 ``` -Error 9 (`CALCULATIONABORTED`) notifies us that a calculation has been aborted, as we expected. +Error 10 (`CALCULATIONABORTED`) notifies us that a calculation has been aborted, as we expected. ## 5.3.2 Python Application with a callback Open the Python example from [Section 4.2](42-python), and add an implementation of the @@ -862,7 +863,7 @@ a Python function: def progressCallback(progress, shouldAbort): print("Progress = {:d}%".format(round(progress*100))) if (shouldAbort is not None): - shouldAbort[0] = progress > 0.5; + shouldAbort[0] = progress > 0.5 ``` Using it in `main` requires one to first create a CTypes function pointer `cTypesCallback` to the Python function. @@ -883,7 +884,7 @@ LibPrimes version: 1.1.0 Progress = 0% Progress = 0% Progress = 67% -LibPrimesException 9 +LibPrimesException 10 ``` # 6. Enable journaling @@ -944,7 +945,7 @@ in the wrapper itself._ This is how the journal is filled by other methods: ```cpp -LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_getvalue (LibPrimes_Calculator pCalculator, unsigned long long * pValue) +LIBPRIMES_DECLSPEC LibPrimesResult libprimes_calculator_getvalue (LibPrimes_Calculator pCalculator, LibPrimes_uint64 * pValue) { PLibPrimesInterfaceJournalEntry pJournalEntry; try { diff --git a/Examples/Primes/libPrimes.xml b/Examples/Primes/libPrimes.xml index e24f0efd..373ecc42 100644 --- a/Examples/Primes/libPrimes.xml +++ b/Examples/Primes/libPrimes.xml @@ -1,23 +1,20 @@ + libraryname="Prime Numbers Library" namespace="LibPrimes" copyright="PrimeDevelopers" year="2018" basename="libprimes" + version="1.2.0"> - - - - - + + @@ -51,23 +48,19 @@ - - - - + + + + - + - - - - @@ -76,15 +69,7 @@ - - - - - - - - - + @@ -95,9 +80,16 @@ + + + + + + + + - - + \ No newline at end of file diff --git a/Examples/Primes/ressources/310/libPrimes.xml b/Examples/Primes/ressources/310/libPrimes.xml new file mode 100644 index 00000000..c0d12208 --- /dev/null +++ b/Examples/Primes/ressources/310/libPrimes.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Examples/Primes/ressources/315/libPrimes.xml b/Examples/Primes/ressources/315/libPrimes.xml index cf3ff707..c9fde167 100644 --- a/Examples/Primes/ressources/315/libPrimes.xml +++ b/Examples/Primes/ressources/315/libPrimes.xml @@ -1,22 +1,20 @@ - - - - + + @@ -27,7 +25,8 @@ - + + @@ -61,14 +60,6 @@ - - - - - - - - @@ -78,6 +69,13 @@ - - + + + + + + + + + \ No newline at end of file diff --git a/Examples/Primes/ressources/510/libPrimes.xml b/Examples/Primes/ressources/510/libPrimes.xml index 5347f3a3..4a0b6699 100644 --- a/Examples/Primes/ressources/510/libPrimes.xml +++ b/Examples/Primes/ressources/510/libPrimes.xml @@ -1,22 +1,20 @@ - - - - + + @@ -27,8 +25,9 @@ - - + + + @@ -36,7 +35,7 @@ - + @@ -49,13 +48,13 @@ - - - - + + + + @@ -71,14 +70,6 @@ - - - - - - - - @@ -88,6 +79,13 @@ - - + + + + + + + + + \ No newline at end of file diff --git a/Examples/Primes/ressources/610/libPrimes.xml b/Examples/Primes/ressources/610/libPrimes.xml index aec4062e..373ecc42 100644 --- a/Examples/Primes/ressources/610/libPrimes.xml +++ b/Examples/Primes/ressources/610/libPrimes.xml @@ -1,22 +1,20 @@ - - - - + + @@ -27,8 +25,9 @@ - - + + + @@ -36,7 +35,7 @@ - + @@ -49,13 +48,13 @@ - - - - + + + + @@ -70,15 +69,7 @@ - - - - - - - - - + @@ -89,9 +80,16 @@ + + + + + + + + - - + \ No newline at end of file From 026fe6fc88f25642e941d657f3f041ab9f3f6ccb Mon Sep 17 00:00:00 2001 From: Martin Weismann Date: Thu, 13 Dec 2018 14:01:17 +0100 Subject: [PATCH 03/22] Fix schema, update schema documentation --- Documentation/IDL.md | 21 +++-- Documentation/images/element_bindings.png | Bin 36429 -> 14742 bytes Documentation/images/element_class.png | Bin 23472 -> 19852 bytes Documentation/images/element_component.png | Bin 47579 -> 45045 bytes Documentation/images/element_enum.png | Bin 20208 -> 15743 bytes Documentation/images/element_error.png | Bin 16216 -> 12776 bytes Documentation/images/element_errors.png | Bin 18558 -> 13662 bytes Documentation/images/element_global.png | Bin 26705 -> 20610 bytes .../images/element_implementations.png | Bin 20158 -> 15120 bytes Documentation/images/element_license.png | Bin 17520 -> 13860 bytes Documentation/images/element_licenseline.png | Bin 11583 -> 0 bytes Documentation/images/element_line.png | Bin 0 -> 9392 bytes Documentation/images/element_member.png | Bin 20369 -> 15008 bytes Documentation/images/element_option.png | Bin 14861 -> 11231 bytes Documentation/images/element_param.png | Bin 17599 -> 13848 bytes Documentation/images/element_struct.png | Bin 21276 -> 15631 bytes Documentation/images/type_export.png | Bin 15913 -> 13817 bytes Documentation/images/type_functiontype.png | Bin 19616 -> 15079 bytes README.md | 2 +- Source/ACT.xsd | 89 +++++++++--------- 20 files changed, 59 insertions(+), 53 deletions(-) delete mode 100644 Documentation/images/element_licenseline.png create mode 100644 Documentation/images/element_line.png diff --git a/Documentation/IDL.md b/Documentation/IDL.md index 4a9ea9d9..bf8da196 100644 --- a/Documentation/IDL.md +++ b/Documentation/IDL.md @@ -4,7 +4,7 @@ -| **Version** | 0.1.0 | +| **Version** | 1.3.2 | | --- | --- | ## Disclaimer @@ -76,6 +76,7 @@ Element **\** of type **CT\_Component** | namespace | **ST\_NameSpace** | required | | Specifies the namespace for the components's functionality. | | copyright | **xs:string** | required | | The legal copyright holder. | | basename | **ST\_BaseName** | required | | The basename will be used as prefix for generated filenames and all sorts of identifiers in the generated source code. | +| version | **ST\_Version** | required | | The three digit vesion of this component. | | year | **ST\_Year** | optional | the current year | The year associcated with the copyright. | | @anyAttribute | | | | | @@ -97,13 +98,13 @@ Element **\** of type **CT\_License** ![element license](images/element_license.png) -The \ element contains a list of at least one child [license line](#3-license-line) element. +The \ element contains a list of at least one child [line](#3-line) element. The license lines will be included as comments at the start of all generated source code files. -## 3. License Line -Element **\** of type **CT\_LicenseLine** +## 3. Line +Element **\** of type **CT\_LicenseLine** -![element licenseline](images/element_licenseline.png) +![element line](images/element_line.png) ##### Attributes | Name | Type | Use | Default | Annotation | @@ -163,7 +164,10 @@ Element **\** of type **CT\_Global** The \ element contains a list of [method](#9-function-type) elements that define the exported global functions of the component. The names of the \ elements MUST be unique within the \ element. -TODO: explanation of siganture of release and version method. +The `releasemethod`-attribute must be the name of a \ within the \ element of a method that has exactly one parameter with `type="handle"`, `class="BaseClass"` and `pass="in"`. +The `versionmethod`-attribute must be the name of a \ within the \ element of a method that has exactly three parameters with `type="uint32"` and `pass="out"`. + +If the `journalmethod` attribute is given, it must be the name of a \ within the \ element of a method that has exactly one parameter with `type="string"` and `pass="in"`. ## 8. Class Element **\** of type **CT\_Class** @@ -332,8 +336,7 @@ ST_Type `string` denotes a null-terminated string. If a component requires arbit # Appendix A. XSD Schema of ACT-IDL -See [ACT.xsd](../Source/ACT.xsd). -TODO: include the .xsds content here. +See [ACT.xsd](../Source/ACT.xsd) # Appendix B. Example of ACT-IDL -dolor sit amen +See [libPrimes.xml](../Examples/Primes/libPrimes.xml) diff --git a/Documentation/images/element_bindings.png b/Documentation/images/element_bindings.png index b621caef5879be1a6c10401573e9231ca07f4ff2..0e64efa25fc1659a462f1114b9d063768ca68757 100644 GIT binary patch literal 14742 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%0Aa z#wwiuEAfzy81KsXsrx`u+_SEfXsHlh`ise_PK^RS=zVC_u>UwcigglZxm3#5deE0~ zKawacbamL~R*wvmif+opxdrrZw!(@?^aweBCq6DC#rNv(hvM(sWpV5B&H630wWA= z9e*jkt+t_DHGCIR&oXq}3rr)&3fc?_XvrH_F~%bl&V9+09QuL#%z(a>m29`mlm1^y zerV~VC+$86GCvRLB6CRP&V4vZoeEMXTmfKL=tHmjMD;7Y^UC7g3?jj#3EHTaTlhwV z4)Odi@g2w<_u=j0Z180R?LVXWY0Qp*r~unK_V)Iw;U8tq@Skdn6D8~ViN9L&E06kz z|K1n86J~P~X1DlUdZGt766{uwW&{z-JqtP28U%SVX4KSF&0$sR(v}-w`b5@xF3Hf0}Sf z!AGB{#35EVyK_-r3cq8MuMoEu>Yt<=6N;P+zQr!hQgPgiY}v>X#*l5ti=U$a!De!v zfXP22`rX&;Xg+&ZkoxRRDls#!T64}mF1M&PHnzZ5lK#`9b6c8usar)nT_3fe(;j=I`YDk~?Lf?BT3p57zu{KEb+Fx)oo6z6metpM2(ra1lvTE=gMh zoL4xugEW|lJl!iagz5VBrv*w%wkF&9ZvZ}6HGfJq|J*Ovo24(L_|!I{2hv45+D5x8 zaW6U8DnEtnoByqN?^4*x96s(FGCtwLIvH0rw;0gHEMGPEDq7KMO043@>Y$^6LR0m% z^HqvG_w5(0tMorfgTc%%I;iZa$QAwMINwuHgc}GgFb++okZeaS^?API&!}d5{AH3( z%kZ4LWI<5OtofP1TeDUnBcM+Bcv{H#X~@o%31Eed^QopQX~jy&j;z^H+wpxJ zVl$uteo};{Gwvly&KPe5a1RTP1_z(CA5y>EPO^uqw(&>_C}~bIr(LQ0mb6IhTriY% zB(^G1vM3f?iex%0s*DO)JKUJ%8_=%F!R5{ZX_HZ9Ny>c+m@rQ458jdQjcoHN*)f^2s6kIu9ey5B^J$U!%R;g+?P2+zs3x z)Tfm2YP&vb_Nxvl@e!dQ15N#On9|-tG4@hy+>_CI?2#S4qOI=Xtc#cSmrjt*n^VSb zaI!n!9E~(4-hl}L`jW;g!q6^@Go&eh_p~%CXjD92$}%k!R%72ierNkG6tj~#`Ov8= zH_Gb<5%)vd6wbomsHuHmK*)_c960a|??$YA4SKmE9E&G@^UUJ8A#r2D+qB%{FC?{d zJr)_D4m#iKo&-nqlC*K)mNDjv2LT>LLC$|GZQSm>@0L%BJu5m+aSuZKmO#&l68I!i zx3r!z-AA^m2tYPml54Slv@#fz5KMr5X;YiPrefkvAhHM`%v*bjNTnE%=vzMnv@ru( zO-tM+Oo%@#L`!O0V2PdDk-Z=RfcteNdw@LM`=&i?4uH~(2J7vp>MWl|dp5^<_B0o_ zdo}1CnaxP8O>(EO;WwL_PGQHTx^|y(!7s060j?Q6pT48Zvcmgqe#D^;Jg#bR~&jrWx z@{0JVJnmQmv`@y;yBE|{v$@=y?O`tB;rii1U0PX>>)m}jOW0O)IyKcoSFBr2g{l5b zD+E4(T;8-H7EM4#DFH x%TlsB#58zn2UWY0Au=^nb!3XgEZxLGZDU@|;C}rf-k$^jwAA!fD;~cH{eLHtB)0$n literal 36429 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 z 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 K7!xnL#{LJ;vW-Om diff --git a/Documentation/images/element_component.png b/Documentation/images/element_component.png index 64227d144b5a6c38aa7617d2a61765b0f6cb61c1..eac80bcc7aa3fedc4656f9c7d0fe9c7f95825cde 100644 GIT binary patch literal 45045 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 literal 47579 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π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 UkB4W#7RO?sYob#Gy>{<^0GIo*>i_@% diff --git a/Documentation/images/element_enum.png b/Documentation/images/element_enum.png index 05a449786dc61b393bd0fd66d983bf9cec412e95..741094a5148a20da8a2ad67b9d1d1e864396bf7c 100644 GIT binary patch literal 15743 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 IR8M}7v617Qdk64LXu~kre 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 R|IR>BlvR@{lQRDLe*qSghG75z literal 16216 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 diff --git a/Documentation/images/element_errors.png b/Documentation/images/element_errors.png index 726081c421ee6886bb9d59d58407bcc24da53b90..02e4d78a6c2f8acb92a7b3baa9cee57c7509b345 100644 GIT binary patch literal 13662 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 literal 18558 zcmagGXE>Z+^e&tbL=Xw0m*{Qu-b3_JqG!}#COXlH7QJ^yFVQ7RjNU~bqZ6Ww&gi{6 z3v+i}@OZW#h1-uvJFP=Pkf~TY?tNG-~Qv~XL>vK%h z>-*Bo{I%K6E}g?mXh+evnBb`RQkBBZT3++~NP^=Hei>yUphYW_GaH8e&THbkA2M z)UDm-vg&;#S4XVEyIyv(zFT1|Fy-V*0S!SN12_iFtlwHn&v$3?VO|&eAKdn4li!HB@AKp46OQh;yI5Wbjhdm+uZ9wv zfN{}yCE*Q)N<{saBy!oBsZmi~OoQX>kmF}cN&|!$YBAnb-~>98pkuUTl3#v~h>UlO zEcelM=6x@d_vY$<@(Tz+hU)C*aJ%~HXMLd9d%l>nclhAUIG$(ymn(hLWGUd51iECN zm;IN_>#XKXqid{%tgBVn)iuhR&~%nUhO0H3fHfQ@m8kSr6X73>508uDgkt=v2? zI-nc|+JX*?lxeCNf@C2YZ)?0bQ49U~*2|<9gN*N66f^IzrREtVT`5;HPcu_9`(5H^ zCR2S@Uq=`&VPR4MQ302NNt|Yk_irVh5bUv(+?JM z{eoy0xAK#{`)9LvxNAOKtNu}hyuSSnE5JV_rCeh!XhXW0fFYL78qHfxs8UkH6TJ#U zB^+Wv?!bWZ_34B@rM11J**ywgww^5*r?j0Xd7n& z4ASp`Yeo=^usEV^4rd|Na^JA)mVJc#Nz(-gM|#YSj>hqBg;oQvcE^>E9{nO6Kq8UOMNEoCpaNKQrS#45-)4`1j!YEzvV9x{J%zKx-K=1MXicVSwisFTU)76Xbk8EG>Ek zo3Hg^UN{=lahc8aD-@EXh~s@Ijquv;3%rjN9pT2M&p{bso;_#KkB7pI(+1U-;UlDpb1&GnyO2jdgT)8p!xe$kSK_r^}XIT1J8W%X@J zBihCa7VWMCtyfo({_Ch+avaQ6@11X_mG_1fc>Ahm>CI1xdVUabane7qBgyW@P(~v2 zOXfkYd-#ZK<#zo<<&tDDlLNUdUwymkCjRA9pNI2GrcL@e?@v30{0AMfLuzT}D9 zUciuNQ>f@r&w~z(u;z2!S@Dy!*~BC5GeVm#G{}T=#9xy8KSLm(AC+L7K}z9~PyyoNImkOE`+1=kHlgzWxHd z_Jioz{&fZ>LL8OJ)QC}|3s4B!DrO6NHyuT~J+*B4cvgVarD|NkW*+d8YM2doQk3&l zUO4)5&>iGS*IIjOnqIYy_Z7UNb6SpkAh|QY&1ZGR%WtmsJ*ILon@QPH&)35$nub0M zXVhggEjgM&HNzvfydEwM)271~09cuHbfWC?`xrmoO%_@?(cTi+u$Q}u3Z&Ex2C;yAPsbEad$@e#)r9{&OYwZz(QD6hMNXBvGR_Jz z>Pu&$!WfL96zOdrE-m>#`}?*9mJg$>b_w&^7yh!yq4pI&`ldC}_~7E9Vk)IYveFMg zafeSkcw!V{)ye-Ab7r9O2@HIN>nnE7)nvIU^OHlW&-G7CS38eqjRW5z=1d`lp^$?^ z=1qMR-^TNWUwg=-`qw53;^+=b_D&0|NE-#h%#lQO$!&(KJqN!GVh(-T%9i67cN0=~ zgg&bjOSz5Cn?DfTkF))615j>kLO+Hmbf*I%O$I!^;9nz-w!_sai*9S$|^PPd&4TyOf_ zTafcxe)uF3UZ)za%MYTXHW!^@{m&VL|8Zuz!YHE}a3l~v$7HCK(&~j7ZG7L5xWIMe z8>`lMXJR$BGcpNb_(MTFA>!Z@NuBLjXy7)Q*}S!u(I%TB>0Y5P#lb4Xv2?hCsXA|2 zoa5W%UdT4Qp&0_c-2MSuHQ2DLyd`f$X!?G@ zQRH^?x#4xah++PaGQ)}<5ipUAq>_a~LVQ%_yRPCGWy7Ng(iqh#L|sa}+`=D(`1wa? zEOPc@rW+hr6I>bozo?RXdHh>c65@!sg%ckd(o| z*v}AJa#&@nM>3XZJ_0y%_SQd@Rn(Wo}yw_GUk4E;% z<%QOcJU!qo14F-1Yx5Z0Brt(<^b*mHEW%8@bUEu4`YOC#!4*wShj_L(!qVg9nZy{_ zz}#%!c;ng~_S)L#zrYxWYsQ4FALz?K&j*@Ul6XZ3+=kKx;DlJ=*K*BI_@{)*3voho z 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 diff --git a/Documentation/images/element_global.png b/Documentation/images/element_global.png index 1e7dd12d602ba95e7d262b23dc6caf9cfaa91459..4931fd68da7035f03619779d25839daa0a9ae441 100644 GIT binary patch literal 20610 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 literal 26705 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 diff --git a/Documentation/images/element_implementations.png b/Documentation/images/element_implementations.png index de6cad6a39092da6a09001d04f424721e9d4672d..2b96d82002c28792c9e88bd611665078b66c1842 100644 GIT binary patch literal 15120 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 H{eb@mYM#3W literal 20158 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 z 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 diff --git a/Documentation/images/element_licenseline.png b/Documentation/images/element_licenseline.png deleted file mode 100644 index e35677a2253268810eb867100dac2028a45b830f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11583 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 M6g1_FWK9D9KiWf?@Bjb+ diff --git a/Documentation/images/element_line.png b/Documentation/images/element_line.png new file mode 100644 index 0000000000000000000000000000000000000000..216605b4812a2a4e4389c7e0e7ff6d6afdd44975 GIT binary patch literal 9392 zcmYjX1z1#Fx26Q?l9FzTA*H*!6@;M~x>JypMp{xrQc@TkVCe3acIZaByYBFP_rL#r zo~iT9IeV?W_KJ7Cdq-)iD_~>1#y~(oz*bU})kZ)-1j2uNzeI(98U|@~z`qdPwH2fh zDn}`H;1?*?Qfg8N2*2Vn@6BGouhCr;_1zH=2t1zOh)Y(~-UtW`a!RsN@4SroL#QGn7!ulpd_vfls0B+i2h`dxyE_wQ3%Q4@=ZLEnt7p4qiTZq1&k|e}47jgf|MSZtu0SDv zB9UH!;;7}yII=4OR|JPrctggq|ZUNM8^+1^MB88-)8g4vB>=~N5hl+YhRKX|pHX49Nl zSM8A47`_zRxUSgznVHcotEl(^076N_%{Ia^GG5!++PVf??-UUndPh1%f2g_c_Sw$< zI3>@G)z!}&8ym}UOQ~9)(Tx#C7iV*V9uguii+Qq!P>YS##pQ;G^5tFU<-vTm?{Q$+ z%a4ZrsXA!vb0-Pp+*k!wHg>O#{)9Uy#I7KJDNT~xtIG(ba{H4h|(x)%W8!h_lW z`^N<>BS$@<6eVz8I`?JW;x`BEE>c^+<*JAkhK1Ycd4HkC6p}#tD6M^Dw#BWhuY0fvsKE8}>u(eAyoSF2v4Ncbb2ns(IGFwU{=l z0Zl@FyLEB(Qe|*Ogy^FEE7jFws1)UUiso-f&lzU~+x%^B_W7b7^W;y@K!s(Wi?P2^ zweby`c*hl-4~!2r8^jsS*BU!lwLt9HBkmE|0E_xPs*2;H%4w1r)~^KwD2*v(MTArAavymbEw zL>*H7nJSAXibQX@Xhbz0TFQO2v#cXGEwU>d^&g9_>M?lhBAr705`X4e&X12L z);d@>U&!1pJF6Deik;aQ_Y6nceA6!vl$G#1lV`;N-L+>>|E`^UiZu4~wJkKXQ-u-| z9{^Qp@NjnM1>@4om2p@!9P@bAGo3WLFYotE>L4Rx1%{uh7TX8g59C)hrepvXsLkn2DoT@R3DbJ!8 zt%!a?%i>P4Wr@@m#5zvVPdp^!Pe-A~3_7}{;v}(+xV{|AKP4LsE6Ess`@iIK=&{lXLq@Oyo(fR`mb; zw(fw7=HD;z0r9QtGNsFMffE zV?>tP9lWlMg|58<`1p{%Og>}DFrQ0Z?7f`#(9?60iI)Jw7<%p6mp6EMuk~I&^`N#k$X%R>`r$67klaLR*>(-lwXz?UE*7HUP8`#kF zDDff0{6ZcD%2P)Qr8<7$G4ny3B0rKz6lYpadVD7@YKA_W@h{vjp{&Crzv*q^obsZJm2$7@Bkb4Ua!&T65CEc z8w<4OsoF675c`rw+5>^qA~LdFJ8wu8ZvLXLUzg(7F65WkZhv}fRE~w;Wd(fZFk=o5mpbB+eDl;UPEf35{_-k^% zOZZv#$+u+qHbYrp)81+GEy;_(0~0WA{>q-AfmEuB1`ep))6gO&sZ`dTbN*eT<6yrF z7mP&i~iyc1`mp?d{snC+Vl-VSz>A1u_1MOV z#av!dSmWmexjtTb>W@_ZiKyEW+tv7m>_$)8ZcyVkm4+7jFo#WFwOLNB*(y-xq9?jq z`bwA_xL%Q12q?62Oqklvw>MWRsknso4QBRD?0og?1sQ<$*He^c{P4 z(53+3?rqD&sr~I}vjnc}J$G4&bDV>OU{|uE-+~0GSoqu+PBSmtrm=5v%zygqJ>Y<15Z_&sif4&K3wOM7=!Z#D9H=*xk|9B4l6&xo$1Ma-8qH!qUV8AHW%Cx0vK~ zQ)hCm!V0d$bW9TJN&!grQ5f{`#zcj4s#vMWB{gO#)fzt!VgaE<0`8KRK)EyMg8U*< z3;1GIR|2bgNgd{r62+}EvHx*`B*)MB+1_1T6FSRPY{l^S!YcxuZH>fjZEbZMf$A-1 z1I2^=NYyHj7t?Stl%aFzDiL0%*jQQ?DAM*{1^;ZDtVImE7X#i^+SQsOyre;T!c-dJ)E(SjAn6kpM>JD6zf%deu`gK!znZ znBk$I3T*@x1gB_UY-Xqzm2P}XBxM5(y>;4dpwDt9S4pR~{IA!^b{594eeHIvM3M znHtWJS&;0!R0(m_@$XGenI-EDjp#$}X3?*!D|hKZ#- zO4C5M0umsz^^*+agK+#z*? zHWV9#x{4}oF`yyv_Kg6KfN0LkEYd87a19=Hst_<6mbemG76>&5B3|#d8!~D}8jcfB zNF~Fj`_tv8N!yYdVu*{qogG1E57vv}wjO@cBvJLv>y*O2%DjeLUSXXZ$ax%Hx_V)IKM-khLn;5F;TmIy5L`vYt)n1GzrlN=OQ5KY` zUULmfi1$HBpu>bTH;Xc-yTDz72ff45LL8w_M?`}HJi>Isok z^4$!749P>SaRjuc*Gi|F?QW|=qyPKN0xVo)_LKu?h__xsT-TnbyhyPVEV(3twiF=Duheom`A1+1VpX`@2qFS^sqMdMN&T6lI+m zDXJ-WO&7HAK2;CqhJmQJE?6dai;%M3K>%NzN@KNfaqjU)zyYSL@5La3QHyts!R$ju znMqqTDg=*X_kx_6=*QjIL>j-5SMUP}Ms#a6ZOIHPoi`t9k4;G{*^ES=<%%KQf4}fE z41w1fl5%5^3ZQxnO2{~R)ujW|0yD{=M?;I9@Qs9?sEnxo$fT)HjrVjhzN@}hXZ1fp z!(aUlo0YTH2*0A2Y6)1k8D4Vj7&t%MOtZaNa`$MIXr{sk&;b>%C&@V{fi2t8d)Qs+ z=~a3+S5wdH1MUgq{wCcHTArBD)`N>e&0oCjtSf2yglKfQER`0g_q!*=dHlwobE09< z{jce!SdHlxb7^s{;IEO=O0g+7XZnNhvl-g;C9}>HIcrPR>NU%it*T9NKjIDWAEcqC zRgi`s=~k*4vb7{beE6xoY6q}Vm1xeuFx8c&y;vpOnrG)vd~cn2c9uWg?O zjqQAzqjm$EQc%?|LoYEk!OMbQ*R7X|+sf)yXC0fRv-?KFXFRE?6$`OgakGEu`HnVZ z9kzYUad&I2Uezw~3*d&m4(o!}0slS%BBnjpu`gK4!1S}Z)qoSJf;{ev9JbXHR@*-J76r4ZfI z#>(mo3*CG?jTo4DL&22qu==4;T|o}YB?gM7{wUMZ`cmrYM4k1f4p?%UGH;vvkaiw0 z`F0oFlA^A6&v#(-p#SMyfx0-tN?d+S+-UQ|TWj)ZRdA8NvzN&Dq0zh?r@u4$L502M zRXjX&5?7E&3t?Vwnbi6T!LE7x-?F!D$G@MQKQyM>=tJK`YGjhIb zVA{d?r9-t!%+^DZ4aoI!7EWY}ZSniX2-|7<`_~>5&~ARC6VDIf2bxrOk&e~5O8Y9! z)CxM*ZaGqm-tiWUFFK4V&mb?XeS6h)Wtx5?YAurqCH4L1?NXk@-D@Gj_anT=)-u-3G~r4 zV@YkOxd=Fh8rEAl;`Txd21&p1H21yvE@{}z1eAl?&sKWE{TZZAJueka^-Z;W%a|nc zQaD5G;kDh|EuC6U>v#U2_82LP{DH_Vj~d{K>g8_=P3877dw$Qpfi;1cZWNRSXp=uA zo@}~@NZ3cowX*{aDZ2KaYW?5%040cmW_4@>s@ape2e@g6Xa}J_;%c$7kexkVCN4Y! znwj@J=I4yX39LrBgZ%i|$Nf0)-+6mfV<$ZWtq3BsI_cwjmx ztBhj5dQKyX2^>K#u6bBsT3{-;JKmv=^2>mi`gWKi%p){kZPUIj$!5*IEk-rs4e%at zMXxxx#PwCu)QlFDp|!R6D~G}lGg=%yXr(bN(Bvo6yxAbJWIg3YpklK+Baq95HNmMz zUD&G-XoUMu5Tx34`Tkm8y=MmvTH^Ic_iIB{8qIkLT)1P0EJN|k--O|5kSl)1VS{)= zYAGrbX*nPVg)dsq(_gWKF_@Wc89-P2by+07ROw-=L&Zzsj01;BT?lc-oRS8>F_%8# zQg#plp626FNIGan?lLSI^ft_Cbr%+nZTeo^rhVjSv>~xX*xFb_MH^O^Y>+8V(jLWn zWQ~6c!%6`^?10D#%Gt+;79QCxO+mp4daR{ilBM5eaTmUFX8~T-Z8|6@K=BUj?dNwk zzb?Lmd1ZY!sSP>w_2Z)qhsEp||lDX@(5Zn6?RA?ZT?$XIE+H z32RfO+J)^&rAd}}J4Ig|{rn4?@v2nxLqjQK$9Ow~`LQCkzHprgbJUWu%d?E8GZ0!9 zs%B^X5>3gCpqWRgYbilH8V6;f!Ipfs4Xz}vw}TW&9EzAsbme<5%Y&6&Yn@2lF%k7cpps^v6yf70LiJkD*+kxg+EwV@m? z=T7d^%^A_#JD9+<8`eKXvtBHXGad2!H-rS~b{H`$4*Y9*Emh?l$dNdOx= zr$Uyxu^$TC0KHk2XHN?G91T(=Tv;QvVwP;b_C3Ta_8|-Bel!Eeslb94n+nFHeoMlg z`a^)P;r&;FK{`ZCQ{7qOiR)o)iF#7QdNiMzDo3gM_^PX|VC{>ehx9zt zi~ouOh{6ty)W+_2@eS^E(GQZx_Y*(a%|l|o2ikD}*kGy(oBX!Va|R7HxNrZR_@Uyl zIY@-|DDLYODG_Z!+FKvoV( z4SLOp)*Sv0mr__3SK^*)(QOFeu~$(yL8u`r_3-eZ-uZYLZl;R$r#y@i7ikle-odV+59h)o52PCXLa4oGr<*C+LM-ucRjt&z;qqN4C) z+$S06tg&x}Z^gkRSIi0Sf7TS2>Q&quVqEmTqc~g3<7y$s2=K(jQn|;@DUm_FOJ35! zh`{pxY26%uxLHgfd^vBSv$^?)#|k%2Fq?gxrx*wcqC$GjX23AD_rw`tjcX_V%Z3fjNbS zD{#NI+&VP=;6c31;0ynYo~fc#?p`d%p10PvL>IPu76ygh9=y9uc?i=&W{KIsg$8i@&f%}1~87Ken zFMk1=ucvCi*J7jRGq(R);J>$X;ZwZ>lSnSzt44&!b(bj>K(^6FgMItUOA=lJ^{a@X zfqvprkiz;^)0Xd z^o@%KX4uwSwmU%OtvJW=d=ToSgDM-gxM+Y)pE;N_G=Fhrq5qL+M`y_=^4v#H{C&>( zt+S2E$s@_`Q30-RZ7wMDpZbZVP|-iX#`oA~KU}xT15oHpJP3;>*@+W5%=JBNh^R!> z;z%2UYb4ejw~JDs$oxZ;zB5VzIqxqGy9L)PSa{kFWcqTfFFVD7zVAh|h0YM^x5Q+Y z(fGheLtx*Sg7lzM19P9C;BvESisRq==rdCNhzEE7r5h^xDm{hw(29x*b?DwK_#+(a zV7WF%EJ?tKeiwkpke<`&M&|opm}Zey++bq!>>2L?CFsFleE}83p@c5En~Dg|dNOq8 zF_Y2VQSSFpSE-&>{?CP6g@x(IkaUCw3k4Lio#xW3Z>0`h$SO&W9+Lg*qsmZkO1lDv zs4EM|2*xaRvR7yLRQz<52M)R;G&_)?GPS0-huN47i3 zaH~=F1EobkpF4O`*1EL&?-BjXuYzpuP07>3S48DdhZ;+fNJTX$jIhRep8|Ee`j3bJ zqM$YUYS^vC{(Z!q?9ZcP9-l+X$A$~by^AXb3n28GX&D9+I)(Je6~@IqZ&l^~+kSQ7 zML@M2VXSk8I{z^s3jV>>9*0nA>S4UvQ<b=bnrg@nbsS>I`pPXY74Tj`E;@T*LidIDt99jcjVb!zhHnq+rr1UUmF zT({MsO&_Vk8GyC%-2bQ*?|kl)a!{&M{P+4~-D9I4|Eel=X~}qZch`;9)7_od@lRF9 zbol_+@^eY^qZuP-v)BoSiEwCMxf&JWfuVkHt|>X$N7L)WQ{`69vg>u z2i`$Dyjlh6L$vmplN^y2?oQB3V>+9qoMI@rS5de7R&zo=w4GSfhmIDg%DDuZ5?J;@ z9p>lfZQ+}dH%S1dn>$Dk(cSm&-({DeKYtECE75(TJJ(bo9Qg%!aiRa5PsRlUm{O(N zDS(PsDw!Njkt8fA_YZa&PT%*5Zjv=Ty1lI(Ffr+Q(cP@mvKNwaxgGmOTZr^8pX+o`GX0-iNK*lT)BU!qbSly5$X07*+8=b>=` zNAktRh0vrkoFRo9OOq!#r)l67JS0c2X}<-h*XQ%ajEA*+Ss{?J!gnif)=aX3=JNEX z7647^ODM)Z%fTmg_Wz&`E`{JqmR_h3_z@cN1D8GU8$MOYWS1nWAYxh)$FLXwclB=77jLlMf_zvaqm_u8+XI9B;QRe055_neohb@wt%8 zM(=4UCef9J?Nv3uBy>_xhGw`ViprOa9GNjlg**eh*Bf@+$e-mfw~1D_kW%BBhE_X! zHJA-$>%FPH1=ZmEk76Vo7=|IVX4AXKLM7#ETqxmYY9g<%Vj41Rho~_drgAJXw7=pu z>_JZFraD`VOjAYKwWUr?!^*tW93%aKu_vV5++^1 z$FiU+h{dk58hNdtqmvX3qScrEmB0?d?vO5dQy!}&6u$ZAvaiJ>cniy*ttcI+FBq3RWEc)fw!c`b8sD0?PS96*@`jebU>BPoPf_P0+TQ6#5pv^YrLXIDW+Ce83@G##8f|Z z?nAPTg<-xBl8yTK!g_&_sxZzdTc=b^xC7&<+Kmkw?KsYYf_-~lZuTp9dx9CDir|7n zoIlMl1exmH)%iDvA6N|HWZ|bFm~1!(80B7$-RuCb zfovdn>!N{I+bMO*qR(U0j(?yCXNg~}=5i^eLS(IubzGqsoPZT_iZbVrA4_YT72aSNYT>7h O5R~N9Wh`**Rhut-%^Kss1h*kH{6 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 literal 20369 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 diff --git a/Documentation/images/element_option.png b/Documentation/images/element_option.png index a4e45a71c7058084347f250a1348fa1f028887bf..f3e313f05d58e0ef74e40f361be1674d2ca6ac6b 100644 GIT binary patch literal 11231 zcma)iWk4HIur3ZQRwyJ$aSd(-id%5^;1XPmQyhwWutJgIg`&Y-S|n(J;uI}btdv4= zUg*8=-uvgtk8H9zyF0UI=FEKa&56}iSHOQt@e~CG1z$-~P8$UU6@vVog@c7W_Smt0 zLVlroYAeW~)J(kCN1kBVNvlbtpwuVh-dbWJ&!4y}LOfAWh`k;^sH?U#ekdsHUP^M( zx_)Lyc@ADw1{o)JVT6I}=ro44kh|40`d{`i9$7+ee0-Pak_Zv8={zj7u6CvAurF#X z?=WO&3CsE4tzVL})W^!cAcQt5iB)ip{&pURy@V8FD>Xxhe8dKd#R7V+3)*j1P0J^! zyj9u_mdp-XswgI_b#`x$yF1kN)P!GeVs!mo4e+|XeEqrJdT4KNsyK>4A?fSJ=V<(s z?i<%!*=T~Pz6fl5Y=Rdbd{_O4>OvlZKX(V+*t@&)O!W4m9DVP|x;R{XUf$EQ_H}+9 zSl-eyUl;KASh&OID6YYCcjB3-&mqp#%uF$>HMPOA?>W(8G<0qAp81CMugapqlcSk-Va2Y*UxXD&-*jw_;wSyg$;I-0M6%z zb;1_9_5lH+v-9&anViNXU@iK>nwq4grKN-gNHanX7XfInXIWqWh2Ic#<6~#T8doHz zoXHO$5dx!fz}QFl^7lY#=za!>@{I$k1P6t9`hU&;j-LJ{&)QWO5`%70sx@_ zoa=WbNWdToBO{}Ph!p z{-d^5&Uw=D%Ex=2J3Fnu9Wl{Yqsx82<{`WCt^2{(A-{nF_@8hl1R7%GtA8N(CDMfZ$rHHxA~9>Th>t_x;n zobm1(C;_c4uZtg}V@Q@WVYW~6swG)WX8Q}>sn zE05afuS?~tE5V?U4e0eB^oQ>p#-00m?GC5sjrYAWMysOlnYk}9y4tVCze>nw`2U^$ z68n6=#y`m>PTPW`z~{MIu2^2CXy!J07Hf3GC%nN6`~V!n=ey})d0AAxutlsU zZ1!%o*?fzF>NoFd9;OPu_P?zCGJiD*kKPwm=}|RK<|=LR887L{xgyFrolEEqmWKh4 z^A*#|sy(@M21VodxlV9_=Is)Hr*T&U8?(QN^?l#hu_$!mUy$dUKAL4x1~wGjiRl)_^D1 zTyvRD=zH`t|$)q{E z1hE7?Owhb*Z{LXGo`RE-PMnh&kS9Dkomt^$5c&_BtIhe=v_o0;lT!@Q>`Y&ArOB#? zLL$3L9KD){c+#~(jr+aN>U8D(x4Ohy(sid-TEnJiR*9mGNmQj@MAGL|nHQ;s#-1M- z<@I}!)Sh8TXk-$_X)8k6CdZhZmZBQeE|1b|j#a$s?Hf8DEJSxciZre*WT7+kF!tYE z{3TkO3sXrS%lXZAJz~HzwcGOxY;-$f{HNM2C`;lrR^#iLr;4sRH-o1Qnn!t45eg;9N&fBfX4XR0%srNv!?5+O#Ce6rO!Zo8;+$Jm^5nx6L-N$i zc@x=(*AKF~YYWd8u>RA)?HwIzW^O$rmdbDZ~yI5t)zwK{XUyHmZZ#~<+xv|Os)o(W$ z51p&=Z)*AX(c8?FVcy}2j0ZpE*cR*6%6^Y|b$!5#C`r=2+m7Ws-2NN~ji!TyDxSxO z+yi&Q4fcPIGv|Pp4uQ!M$0juYX)h5`QHR}$yi+2qEhD%EVy;Ck{n}$j!$E0T;QChf zA?<#@?fp34%8}mhXzs7I>?eHTUHki!LwU9&e_V`vdqL*>JopB_Tzs2hE1?kgf%a?u)IE9u%ZmCL(_+?6k1f5y z59s#SYL@(5hoYs9lWrlmSBptWNtZb2uM(VAl#wP%>xuys-64LuP5*!dFQJ^d8Qm(q zsXog3GrkzI@#K<0cX5GYN#ePxHJ-pTQ)v=a{sC7GnmgPW2!0+4NSv@(rC1=48 zPfdNlpZ^(g8kHUW&y{&}bi@V$w%S~%oYfZAa^H8xTKL~r{k9vsb?f{y-&o&FSEtrY zmO4P0PSphWf;887i)|(fHjmM5YTAuTePn|$0cGf4*f=Zk8M7JZo@GNvO&^zh3Dlnq zI5;vwNql*Qxup%aP_ceKD-^ARn&PVeY9Y6d!5AEyvknwVQ={YnAa>&ZBdXiqTpY12 z_A|0V=ARg(%WV0|!z)g5D3mDP`|OY!kmJdL7CZeL3ahI*dGs?22DjVk=*$<6M}@!) zkoj2Uy5X!t+*tpbv>H}rM~dd7VceP^6ezB)sT>~)TCB5-D6FUexu3Gn zS`$X2%jFSdr899o;h!!oreFL+?~SViOMGUEFRg97mcfvR1R*F;5TwO5uduK%%*fan zeX1((1h{4u|4o{Yc0+d|-0nBX8ni-`Rz>1uSd%?E!=#j=9{kdqO1;u)IZt=C1lt;m z6pWxY8H1%~Wl=ghIjIT6<68U%7+*DGR3(1|NVRjh7mh`8`Wi2Afg+rt&Z9nZj0c%c zhE>{S&AK{D0@(um#8!I7xz&2r4t?$!s*9aX5G@ky7}ZoXi;D5@qb%pqEg%7M-)W?L+%Am8AdRVO=%gUlCC@Hrb&|?4<=s)avH&OP{e>gCuaHEIu zYyW7@)lm}83rz!eb1lkqE$W76OgZvZl%-X0PU&u{GAp{G90-16F*FAjSp`+6H68Gk zcNWQO4O00?hVn3tW^(ecZyMOxlqyj=FE@|J0EjrXvHi+W2PZe%uwtB1OGek}$y0tu zrDW^MG&AL@cUP3KGc2dWGGdoELfx|yC!&V1d!zfJHwj}2$FM^q>Iq?l)TDi+5z4SN z+mDJhCN=I7sKRu@ukZ>?as{v?RmcK8`Gni>y7gRm{Fbm1Wwc0yRy0}(IZfNY)%hG5 z@u%Y!Re$;v9}i$4`1O{{IYI()r+Z-zayj1Rum-?6tw0vW-P)ba$t7N;?k$&JGqqB2o8|tOL+PSa<#&wh?Dx%NZr53DC(Cz(PXU| zmaZ92Jw9670M|0G7=D21kub5Xiwk4*eBEdtW^_`h=P;zs9{?7n(7VU-C_h4AxhDan zHSs2JJ~fn2#hMA?TON~n`Uti-zGjP_KJQfJOm3gW@PS@)yb75%t|w)ie>Qw5M5Yc* zGC{2KHOLYnJ+RMgAQ3-RNngG`m$^6Z`7@5=)?qNboS;ebJe=6kRKmuv2;AmVimVoX z;9jsDvpouni=5SBJ&qgJhjT214PrK0Z|Qu4A9m-0<2{a)l?GO~>>Q3K&b-{tz}Jr3 zOxJtu>^mW<*7vD8_q<4~k8;5lRk>pdXYExdrHupUp!~(zy0=WA`J89SI?p6cX{N@G1tdy_5kx^d%o0aubSkdij7-u%U6n3{C$R8_giElw+s7$xeXheZZT zwr%iLlL-S2Ygk7v-*&}?@_8UebWw{8#a>}+%s_gAgN%?^-PrtE&QZMR~$H6typ3x%tg-$&%ufO;g2?}a(c!SVHkDM}Q>daK zI34MmIem2xw6`Bh^J)%aJ6gU>{?k!ls^OB6?{2*;RkvI&IMZ!|{_R2+_vO7UdtOkj zWSw~^(sZdWM7^W#%YO5jwro5-e?j$><3Q9$FrVV1h_GDk-va(u%aVWc__ez~?Q2^E zfkF1yZ}vBU%X>by=b=Im&p1P5$DWIIZfp9{@cOvz|C!q_*$$fHOFxz8KFT~B6h73u zbxbya=O$-Vpsi@fXO$J27>BO^=mQvu?lS+Z^n1&77?3z|E}uox~O7S_PM8o2{0OIu-3rdy2zRHAJ2s4G*?U?>QQ+b9+z zk zO2yeF)iiF`iv^DQSoW{%KH;C)ebfA&ZnSjcQ$Tc>|FY}PNDFW}KZ<$xUaQ6wL~ODU z&LNs~34bfVn}};Mc_gfH=37vHB5)aQgRl}G8~PL9LF}Qf!9EVkR%G%ts_^wzX=DhiZIA_L@^Su#;p`BwzOO-c4#+R0Cmtafuh27WN<&}Jl)4!vd5STozjZQ4i)3B=Pz*M@U!DJ*eg&8Z}EFSe5L)_PS6 zae|GMb;M(T3s!q7+gl-CI3}t!aQFu_h|x|Ml3USm*ycC?tw_MOg7JaS<~@>MFb3?5 zp^P_egBXn)MCv6OG|g;BlyP#lDc%trDvYeKd8S*|(!Zq0hF&paAS;aTGKGF3_-6cJ z9;U=lb?T$Ct7MI$ZGL1~7C@y|;DO)d9F$$A3Q;*2F-AL>8-pmg-7g>fxfQaTsad-2 z<)ch@GI$zMa7V@&n#-ZVAQW$DbkQ#9aK>Pk$-(u;^4h%FCM^peH)VIA)XAFuo7@iv z+!;lPGNsfChnCaL7r{Op2sw?EJ~M?ELXZXVW+q0zRLq8vJ$3XDuC2B_D(3zol6V|$ za5|W!mCCUymmLd5mAmP0>?w8deIR5o9P?BHR0UnQEJ2KcIc^b;>ynleWoi?Rtc(tl zS@R_c>O^o2%bW6~YjpJ>-VaYdLzBFd7C{*Gr^8;R!dDE!ORNkA#pIit@u>JzoDHR0VA}pJ5OPJ3)ATWxfM$it2>YKywYFkHB)#Cwv@as7ovLV z?A9~^VpUuHQ|?R$mgRJtuPkmm&A+D^Gdf9?5=@If_+pBm^(*f-KZedtv`PAPob#z9Tw5HVIi9t9OIEIaI&Weuv&|ozr*?a~ zg}r8+Mu;UZAK&S&9wYT+&cmXR`+e=4``cwCm4eh!na`b)(;Np~Y#N1DFVw&0hy+aD zQ)e)g0F_p8;#cdoW)|lSi1loH%&ag1lUo@P6kr$663XVl8h-;tO)2Y$Uuc&|86&RG z(NoFtUd%_IL&7g}8LtAr5t{x9q$w^~dyu_8jUb$w z(GXW8+&CEuRw>PR>9x|NMy!bp=#OACyvs-o_Pqg?e>1SvXaOcaN|`#?kpH;=e`l8a zG7XUBQpVu%p5)P+k%;RzWjA6A0Qem8=e4WkDYA*ABz>+-lk8W#(64Fgf+*y(8-C z)j$PmCv4~Z-jmtxCc4{Ge#DP6(L~Zn7apl`*tASg&lC{pBhh!za%K<}80p7cyLK^O zu)Jv`*lbw~NQUyGes25C2q{6K9fOF+8U$wH6HMV7Kle8@x!jDmFebpu)UW{N-Op_%d9C|WURQ!ZC8iPcewI8!M{@~Ao$-&Akt^M=#M3g<4{r4h{&p!&=J z3-dWK9oxVH6ZKQ;2a+fYS99?c!@=6R%(JSValx8-6XV+c%uVI4YVO7DpcEbVf(0(x zUMcd-VWT%zXW~{i1KT!1f+5`rB4Ir}UwES>lR*snH1{5>`Zd7xD(+KMEdY1ga=@2K zm0zBim>gODHqCxROd+U@pJ)PI-MY5R?yIdSn2>J2$Y_Cq`umeuP(U8{wp8FyOWMA!I*l>I2(Mv7g#>Sz`AP50 zxGQ6?H~dsrSZ~Guk)vje|9@oH zrjXy(?QeG)N4$y2K!Z%#rBLHtO(j+jHB+-GR64&rLajt&V%L&DJgfI#`9hO8G4r6y zq0lY|5HV=co%~5Q=62dbvN4b;b91ND*QWzaOlv(YcX_?srkd4cYF2|PxNw9t6tlx_6tU{}&MeH>CD zCb22+u;AvqqFC2@g5GyVEAK+5unbSu5pNUtBSPR?A#~D1lQ+6Bd?ax`c{X-GsOd=i zcJCWPB!6#ATNng(Xil9b7-86M=0d!YQa@!SI8!CxIL8wPfN1%t*w-@Cnp{N?Ip+pj zDoS&t5yFhx zj0z5;1XY^$I!jrLm^C8&oxQ)Lwp5#9CK&Kceckg-Oi&Krm%tasQom1a@_F(KmJ4?8 zs|ZdZLkB7x%o6oI-(ctK)^U?(qwyyO!E?QQwG)R^n24VWOz(@K*3+ujKdLPsi>rF+ zN|Y(KAF+xVyC;&b1>FNUwQ-(t9pjDK?&;$grzDIOzwzKuBSpM_8+MiJ*~4Z<-S zS~3G+!D0gvQ2nvGpT%KcI9jR*UYtoD@#A{@pY!%d-YNSquR(d@la_AFl95L#l-oN%7Mx6n!F?^reO&ITgB*6t(Qy)JbTh>?O-%aa&Do4|j z+Cj$8^W0t1Fdjh+vaQ!`@fgET2aSf$>({hF)DvCRuxlUZ(zzVH#*L$F0sLCrd4q8F zIBnWGgLqkZjD@wvf^tp)_+H=q36h5l`xi)TJy1EqeFKrH_s7!!??XkvmpMkes8@$OZZSu43EGPx^eD7!z}6On;z z6g8lUl`-JAAIs5!OG#HiNA9R6>LXUd>*P6IGv>wC&?b9$W(%Nf-TUMJ=>YK&o4 zeJ4e8|0{YQo#rz1>Lx$nxNtP4`Q1&Npjun70$zr{s+ZgrW}c>j8n1D7>$nCjJQ_quvI z{$6NO@gmdMmG=rVFZdtNK(f3S7Z-<&l&FuIJXu|i^bOd+jIG%w?i}#>-eIs`-LhKr zx9cQ`*#+4(cNGbdILl%q(C029=ePCaDEcY=S0t6kP%XaG1E@#Xp0%rrow4bsEPCsp zGl4_1oGo2x_ErS5^xKAs0*FjR*%Y6EGn)$Li&Z!}DyiWe*{z;X7z)c43zt52@&U9|OJWDQ~PuZTZ| zgh4SEN6QL8ZZo_ieo}cjM+p(eHhp<+)ob7MD9pp0tjs_q!K@_v5q-o?(%(q(PiK8U zr+>YYyBl0`RdCojf8lt>wm2q@+6*OpA#B0e;WW?nb8qj%;NajGlc=V8t(bUXzJFJL zml*cr@*@6Wk;>e=My7?*wrMqwUJcxjt--a;VTvchQb>Bi>kuw_+{#cc(6^@uNTvP~ z{c(m+r5LR8J$-prQZq!1&rpmh8Xx*rgqBZ5PLJ*iewI?j zo=bnk^U60Y-nnC%OTJqHroS;y+VGF{em*)yguLQ4`4AK3O7v~Q&e>v~s#m8)kYCIs zrHO5<6w`akvQ=moGtVym?qI!Y^Q_bj$yuI@s85Y3vU=wBT=ap4^ai>u#lt@@Cr~4K zBadWNIE#Aj2kW7v0VYu%9t*i|v$Npw@o`-(t<*y386naSBm0C6aYz_&coJg(40!7K z1T`!S5abIa2R+=ZxpkYgQu8r!Kx#K)9E_z_6eEaL6xlh{%-?7`8nSeE?eka?Va_Ru zXpCg+wlO+YTLL$o!T{2q6^5)s7PeOrN_svjxH{x-Uo9w%#Sd`WoJv^ zVBGt7`_*F{u@qJYn*nAnX=cc{M-LjQ2;|{FF0&HRlg_l`juVOYpWvoWv$D5LPL?k< z8357FFlBzmoQ0MUS_&LxGAP61x>yU;^k#Q!LJ3~Dg*I3JYF>+vfle!z=H@oLJt;4_ zHDNqZC63p<+dp3i9(Kk(VQo)-F}V%d?U1sl-OLJLgbhT}8pC5Qu5WHC%FBn|ekE7A zkRsKq362|wJr7ZM(&YrS%tu%G}tJ1p4h&*TUn8D@%)mx(5zD!RM* z`#zURo~-xyV7_)z6;AYzxfE;pOv4ag4}Ui}z@^Ghwt6ma_Z@^L= z1|&kr3}*Z2ayrgB+i>wfm4P}G4i5kBvRA;?NLkLpuoGs+($eZf#>dO@k_xh)U zuw4mN1HU7!Ag>E%gP1t9oWWm=1KOc|^*X_oDArKAWp3woXL^&8r@#Il++F!k>+czh zucBBd)-kZgjr|x(G!b-F2^K7)>!9>e3_kVGR?bZRye24&H^lN4G!>gm#oa6xTxDgJ z&}+wQ^9h=f8rc>1f$s!{$tst`lLA6dvK4Y!()|Uqaqq*GiFD^JLSZ1Vy)gMu<{M2j z5MBp8lhwW9WYdL@u=bh_cz+yb8Wm!q%^ASti2+#K#w)?K(qh(sUpBA+USlzgoxV+Q z*MpA?_nUz=$+MwH>8J_~ij)>5sMJI;NV+hA0tr<{7U)tP$$G-|(x?8ZqKz1_p954Q z35N9gr~lD#iLs?KqIL*vM3o!e&KK>P1og8@|5xo!X#&iKhEa{f?TM!5=I3wVqJ>D3 z!sZa=q>tB6=cx%0$@l@8iy`WiQjLBS^dmubAqB`FL`Nha`zYgM=`ipcqUa<@kj4A7`lf&KdT-(DB=+ii)!fNa@!SM>zaC<^3vXTat zRFN2oNK~0MWS|M-0-IB`_>%M)&WYS!KWTMcm_4Z+= z_v(!?_OC;@S2H#B^hjZa$l<~W^DP{*R3tkDNQyY1&)~2?lo4}|0%!=<<6cC)Id$iL zQe>VWj(*wPYhjKh^lJSI2gTP2WyKWh*BHji=HU8bGfJB!79pwKuRu&Jb2L2aS^Ef< zqlFJ}Qm_*K-z+46qHuI{9E;Z{^4i$AZeA~tt>p7x zL}}zEinZ;hAUlqOxHa9hkY?v>)G68@aVyMb-_hD+`cv31B9L3}N)8*ErNR!+4pH~9 zE+R=BMJkr8yb&3gxQ{kSQEud`%wSBbA#r27LaX5cSw^u7Wv4LxmQ(tHP{kHP0h3R* zUSk?MmVgY&%2)l*+uU(Bz0E~+m6G@uo;1Qor7aPC99Yup>UPAu2^q*yz^T5 zsHjgbnUHw!S;Yj~d8@M3**y>068$|Ig-?l>YrZ`^o5`*+J!{a=xBZkd%af7Ij(7Ss za?gP3Ybr%H6C}l_Y#APXi9VdcU;xqw$$X@qQ>VDU&@wq>&O#_{zkjkhpe28uj)*Sr;|%FG0Ky0aOBwTiG(*>LqGnnseW z;vsbwXar9`Gs+)07$Om@8?7PUyvGwCRYd@HWQ45TCymeABsPqS=ik_}EaHve!mI$~ z>cGb5NeDlwTJPXQp*P2CLb=4+42a?##9#P(ZXH^G_my=1v)-j8@$Flx4;sDNBtkXK zCqEhBgoy6#H-5N}yFjlt*x?$*$(|uulXw=~3oUJMg&*Gyb3@da7Oax3`Y>LQ5KJ&F ztG>n6ENu2mL(HGMljceRco{VK*3-CC6B$TX-jS5Pd)?#$tm(G;%d$A%`hbuC-BhZS sHEX(5ghP?e{W8NM-WYDT|A6j)dLb&F_f{6UDHlZvtS(n0V-fzp0Om5XZU6uP literal 14861 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 diff --git a/Documentation/images/element_param.png b/Documentation/images/element_param.png index 12fe86812bbebef428e00af066386f2c268aeaf6..0f6c827134076e36ea43e509d1fac94151d338f5 100644 GIT binary patch literal 13848 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 Lw6%D6oS67ODl|RN diff --git a/Documentation/images/type_export.png b/Documentation/images/type_export.png index 8df1d3bc144318dde7608e24c87cbe47247dde98..cda8e073a621ab4f46d9882edb6b4bfe3943ce4f 100644 GIT binary patch literal 13817 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 B(7ONt literal 15913 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 diff --git a/Documentation/images/type_functiontype.png b/Documentation/images/type_functiontype.png index 3acd3be1895bf6ac82eff010959162584528c2a0..02db1e97a61bc123c9321645ca8a5065be8f0ed3 100644 GIT binary patch literal 15079 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 literal 19616 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 - + - + - - - - - - + + + + + + @@ -38,8 +40,8 @@ - - + + @@ -51,16 +53,16 @@ - - + + - - + + @@ -68,30 +70,30 @@ - - + + - - + + - + - - + + @@ -107,8 +109,8 @@ - - + + @@ -122,8 +124,8 @@ - - + + @@ -142,8 +144,8 @@ The global element contains all exported global methods. - - + + The <releasemethod> must match a method with the same name and the correct signature. @@ -157,8 +159,8 @@ - - + + @@ -213,31 +215,31 @@ - + - + - + - + - + @@ -295,31 +297,32 @@ - + - + - + - + + - + @@ -327,7 +330,7 @@ - + @@ -343,4 +346,4 @@ - + \ No newline at end of file From 79c34f1b9936887fcfcc22abd7acd3e145e523c1 Mon Sep 17 00:00:00 2001 From: Sebastian Pichlmeier Date: Fri, 14 Dec 2018 15:50:19 +0100 Subject: [PATCH 04/22] Fix issue in pascal implementation regarding interface uses --- Source/buildimplementationpascal.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Source/buildimplementationpascal.go b/Source/buildimplementationpascal.go index 9c9b74b0..a9d45572 100644 --- a/Source/buildimplementationpascal.go +++ b/Source/buildimplementationpascal.go @@ -314,6 +314,10 @@ func buildPascalInterfaceDefinition(componentdefinition ComponentDefinition, w L w.Writeln ("uses"); w.Writeln (" %s_types,", BaseName); + if (len(componentdefinition.Enums) > 0) { + // Unit contains enums conversion that may raise exceptions + w.Writeln (" %s_exception,", BaseName); + } w.Writeln (" Classes,"); w.Writeln (" sysutils;"); w.Writeln (""); From 454f338d05f5a2b06e3dfa555f8457940d553d38 Mon Sep 17 00:00:00 2001 From: Martin Weismann Date: Mon, 17 Dec 2018 13:37:02 +0100 Subject: [PATCH 05/22] Fix Dynamic CPP bindings (inline) --- Source/buildbindingcdynamic.go | 8 +- Source/lanugagec.go | 628 --------------------------------- 2 files changed, 4 insertions(+), 632 deletions(-) delete mode 100644 Source/lanugagec.go diff --git a/Source/buildbindingcdynamic.go b/Source/buildbindingcdynamic.go index ef10f1f2..4b2d3ee0 100644 --- a/Source/buildbindingcdynamic.go +++ b/Source/buildbindingcdynamic.go @@ -324,7 +324,7 @@ func buildDynamicCppImplementation(component ComponentDefinition, w LanguageWrit } -func writeDynamicCPPMethodDeclaration(method ComponentDefinitionMethod, w LanguageWriter, NameSpace string, ClassName string, isGlobal bool) error { +func writeDynamicCPPMethodDeclaration(method ComponentDefinitionMethod, w LanguageWriter, NameSpace string, ClassName string) error { parameters := "" returntype := "void" @@ -374,7 +374,7 @@ func writeDynamicCPPMethodDeclaration(method ComponentDefinitionMethod, w Langua } - w.Writeln(" %s %s (%s);", returntype, method.MethodName, parameters); + w.Writeln(" inline %s %s (%s);", returntype, method.MethodName, parameters); return nil } @@ -751,7 +751,7 @@ func buildDynamicCppHeader(component ComponentDefinition, w LanguageWriter, Name for j := 0; j < len(global.Methods); j++ { method := global.Methods[j] - err := writeDynamicCPPMethodDeclaration(method, w, NameSpace, "Wrapper", true) + err := writeDynamicCPPMethodDeclaration(method, w, NameSpace, "Wrapper") if err != nil { return err } @@ -868,7 +868,7 @@ func buildDynamicCppHeader(component ComponentDefinition, w LanguageWriter, Name for j := 0; j < len(class.Methods); j++ { method := class.Methods[j] - err := writeDynamicCPPMethodDeclaration(method, w, NameSpace, cppClassName, true) + err := writeDynamicCPPMethodDeclaration(method, w, NameSpace, cppClassName) if err != nil { return err } diff --git a/Source/lanugagec.go b/Source/lanugagec.go deleted file mode 100644 index 8a90f401..00000000 --- a/Source/lanugagec.go +++ /dev/null @@ -1,628 +0,0 @@ -/*++ - -Copyright (C) 2018 Autodesk Inc. (Original Author) - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation -and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ---*/ - -////////////////////////////////////////////////////////////////////////////////////////////////////// -// buildlayer.go -// functions to generate C-layer of a library's API (can be used in bindings or implementation) -////////////////////////////////////////////////////////////////////////////////////////////////////// - -package main - -import ( - "fmt" - "path" - "os" - "io" - "strings" - "log" -) - -// BuildBindingC builds C-bindings of a library's API in form of automatically C functions -func BuildBindingC(component ComponentDefinition, outputFolderBindingC string) error { - CTypesHeaderName := path.Join(outputFolderBindingC, component.BaseName + "_types.h"); - log.Printf("Creating \"%s\"", CTypesHeaderName) - err := CreateCTypesHeader (component, CTypesHeaderName); - if (err != nil) { - return err; - } - - CHeaderName := path.Join(outputFolderBindingC, component.BaseName + ".h"); - log.Printf("Creating \"%s\"", CTypesHeaderName) - err = CreateCHeader (component, CHeaderName); - if (err != nil) { - return err; - } - - return nil; -} - -// CreateCTypesHeader creates a C header file for the types in component's API -func CreateCTypesHeader (component ComponentDefinition, CTypesHeaderName string) (error) { - hTypesFile, err := os.Create(CTypesHeaderName); - if (err != nil) { - return err; - } - WriteLicenseHeader (hTypesFile, component, - fmt.Sprintf ("This is an autogenerated plain C Header file with basic types in\norder to allow an easy use of %s", component.LibraryName), - true); - - err = buildCTypesHeader (component, hTypesFile, component.NameSpace); - return err; -} - -func buildCTypesHeader (component ComponentDefinition, w io.Writer, NameSpace string) (error) { - fmt.Fprintf (w, "#ifndef __%s_TYPES_HEADER\n", strings.ToUpper (NameSpace)); - fmt.Fprintf (w, "#define __%s_TYPES_HEADER\n", strings.ToUpper (NameSpace)); - fmt.Fprintf (w, "\n"); - - fmt.Fprintf (w, "/*************************************************************************************************************************\n"); - fmt.Fprintf (w, " General type definitions\n"); - fmt.Fprintf (w, "**************************************************************************************************************************/\n"); - - fmt.Fprintf (w, "\n"); - fmt.Fprintf (w, "typedef int %sResult;\n", NameSpace); - fmt.Fprintf (w, "typedef void * %sHandle;\n", NameSpace); - - fmt.Fprintf (w, "\n"); - fmt.Fprintf (w, "/*************************************************************************************************************************\n"); - fmt.Fprintf (w, " Version for %s\n", NameSpace); - fmt.Fprintf (w, "**************************************************************************************************************************/\n"); - fmt.Fprintf (w, "\n"); - fmt.Fprintf (w, "#define %s_VERSION_MAJOR %d\n", strings.ToUpper (NameSpace), majorVersion(component.Version)); - fmt.Fprintf (w, "#define %s_VERSION_MINOR %d\n", strings.ToUpper (NameSpace), minorVersion(component.Version)); - fmt.Fprintf (w, "#define %s_VERSION_MICRO %d\n", strings.ToUpper (NameSpace), microVersion(component.Version)); - - fmt.Fprintf (w, "\n"); - - fmt.Fprintf (w, "/*************************************************************************************************************************\n"); - fmt.Fprintf (w, " Error constants for %s\n", NameSpace); - fmt.Fprintf (w, "**************************************************************************************************************************/\n"); - fmt.Fprintf (w, "\n"); - fmt.Fprintf (w, "#define %s_SUCCESS 0\n", strings.ToUpper (NameSpace)); - - - for i := 0; i < len(component.Errors.Errors); i++ { - errorcode := component.Errors.Errors[i]; - fmt.Fprintf (w, "#define %s_ERROR_%s %d\n", strings.ToUpper (NameSpace), errorcode.Name, errorcode.Code); - } - - fmt.Fprintf (w, "\n"); - - fmt.Fprintf (w, "/*************************************************************************************************************************\n"); - fmt.Fprintf (w, " Declaration of handle classes \n"); - fmt.Fprintf (w, "**************************************************************************************************************************/\n"); - fmt.Fprintf (w, "\n"); - - fmt.Fprintf (w, "typedef %sHandle %s_BaseClass;\n", NameSpace, NameSpace); - - for i := 0; i < len(component.Classes); i++ { - class := component.Classes[i]; - fmt.Fprintf (w, "typedef %sHandle %s_%s;\n", NameSpace, NameSpace, class.ClassName); - } - fmt.Fprintf (w, "\n"); - - if (len(component.Enums) > 0) { - fmt.Fprintf (w, "/*************************************************************************************************************************\n"); - fmt.Fprintf (w, " Declaration of enums\n"); - fmt.Fprintf (w, "**************************************************************************************************************************/\n"); - fmt.Fprintf (w, "\n"); - - for i := 0; i < len(component.Enums); i++ { - enum := component.Enums[i]; - fmt.Fprintf (w, "enum e%s%s {\n", NameSpace, enum.Name); - - for j := 0; j < len(enum.Options); j++ { - - comma := ""; - if (j < len(enum.Options) - 1) { - comma = ","; - } - - option := enum.Options[j]; - fmt.Fprintf (w, " e%s%s = %d%s\n", enum.Name, option.Name, option.Value, comma); - } - - fmt.Fprintf (w, "};\n"); - fmt.Fprintf (w, "\n"); - } - - - fmt.Fprintf (w, "/*************************************************************************************************************************\n"); - fmt.Fprintf (w, " Declaration of enum members for 4 byte struct alignment\n"); - fmt.Fprintf (w, "**************************************************************************************************************************/\n"); - fmt.Fprintf (w, "\n"); - - for i := 0; i < len(component.Enums); i++ { - enum := component.Enums[i]; - fmt.Fprintf (w, "typedef union {\n"); - fmt.Fprintf (w, " e%s%s m_enum;\n", NameSpace, enum.Name); - fmt.Fprintf (w, " int m_code;\n"); - fmt.Fprintf (w, "} structEnum%s%s;\n", NameSpace, enum.Name); - fmt.Fprintf (w, "\n"); - } - } - - if len(component.Structs) > 0 { - - fmt.Fprintf (w, "/*************************************************************************************************************************\n"); - fmt.Fprintf (w, " Declaration of structs\n"); - fmt.Fprintf (w, "**************************************************************************************************************************/\n"); - fmt.Fprintf (w, "\n"); - - fmt.Fprintf (w, "#pragma pack (1)\n"); - fmt.Fprintf (w, "\n"); - - for i := 0; i < len(component.Structs); i++ { - structinfo := component.Structs[i]; - fmt.Fprintf (w, "typedef struct {\n"); - - for j := 0; j < len(structinfo.Members); j++ { - - member := structinfo.Members[j]; - - arraysuffix := ""; - if (member.Rows > 0) { - if (member.Columns > 0) { - arraysuffix = fmt.Sprintf ("[%d][%d]", member.Columns, member.Rows) - } else { - arraysuffix = fmt.Sprintf ("[%d]",member.Rows) - } - } - - switch (member.Type) { - case "uint8": - fmt.Fprintf (w, " unsigned char m_%s%s;\n", member.Name, arraysuffix); - case "uint16": - fmt.Fprintf (w, " unsigned short m_%s%s;\n", member.Name, arraysuffix); - case "uint32": - fmt.Fprintf (w, " unsigned int m_%s%s;\n", member.Name, arraysuffix); - case "uint64": - fmt.Fprintf (w, " unsigned long long m_%s%s;\n", member.Name, arraysuffix); - case "int8": - fmt.Fprintf (w, " char m_%s%s;\n", member.Name, arraysuffix); - case "int16": - fmt.Fprintf (w, " short m_%s%s;\n", member.Name, arraysuffix); - case "int32": - fmt.Fprintf (w, " int m_%s%s;\n", member.Name, arraysuffix); - case "int64": - fmt.Fprintf (w, " long long m_%s%s;\n", member.Name, arraysuffix); - case "bool": - fmt.Fprintf (w, " bool m_%s%s;\n", member.Name, arraysuffix); - case "single": - fmt.Fprintf (w, " float m_%s%s;\n", member.Name, arraysuffix); - case "double": - fmt.Fprintf (w, " double m_%s%s;\n", member.Name, arraysuffix); - case "string": - return fmt.Errorf ("it is not possible for struct s%s%s to contain a string value", NameSpace, structinfo.Name); - case "handle": - return fmt.Errorf ("it is not possible for struct s%s%s to contain a handle value", NameSpace, structinfo.Name); - case "enum": - fmt.Fprintf (w, " structEnum%s%s m_%s%s;\n", NameSpace, member.Class, member.Name, arraysuffix); - } - - - } - - fmt.Fprintf (w, "} s%s%s;\n", NameSpace, structinfo.Name); - fmt.Fprintf (w, "\n"); - } - - fmt.Fprintf (w, "#pragma pack ()\n"); - fmt.Fprintf (w, "\n"); - - } - - if len(component.Functions) > 0 { - fmt.Fprintf (w, "/*************************************************************************************************************************\n"); - fmt.Fprintf (w, " Declaration of function pointers \n"); - fmt.Fprintf (w, "**************************************************************************************************************************/\n"); - fmt.Fprintf (w, "\n"); - for i := 0; i < len(component.Functions); i++ { - functiontype := component.Functions[i] - returnType := "void" - parameters := "" - for j := 0; j < len(functiontype.Params); j++ { - param := functiontype.Params[j] - cParamTypeName, err := getCParameterTypeName(param.ParamType, NameSpace, param.ParamClass); - if (err != nil) { - return err; - } - if (parameters != "") { - parameters = parameters + ", " - } - if (param.ParamPass == "in") { - parameters = parameters + cParamTypeName - } else { - parameters = parameters + cParamTypeName + "*" - } - } - fmt.Fprintf (w, "typedef %s(*%s%s)(%s);\n", returnType, NameSpace, functiontype.FunctionName, parameters); - } - fmt.Fprintf (w, "\n"); - } - - - fmt.Fprintf (w, "#endif // __%s_TYPES_HEADER\n", strings.ToUpper (NameSpace)); - - return nil; -} - -// CreateCHeader creates a C header file for the component's API -func CreateCHeader (component ComponentDefinition, CHeaderName string) (error) { - hfile, err := os.Create(CHeaderName); - if (err != nil) { - return err; - } - WriteLicenseHeader (hfile, component, - fmt.Sprintf ("This is an autogenerated plain C Header file in order to allow an easy\n use of %s", component.LibraryName), - true); - err = buildCHeader (component, hfile, component.NameSpace, component.BaseName); - return err; -} - -func buildCHeader (component ComponentDefinition, w io.Writer, NameSpace string, BaseName string) (error) { - fmt.Fprintf (w, "#ifndef __%s_HEADER\n", strings.ToUpper (NameSpace)); - fmt.Fprintf (w, "#define __%s_HEADER\n", strings.ToUpper (NameSpace)); - fmt.Fprintf (w, "\n"); - fmt.Fprintf (w, "#ifdef __%s_DLL\n", strings.ToUpper (NameSpace)); - fmt.Fprintf (w, "#define %s_DECLSPEC __declspec (dllexport)\n", strings.ToUpper (NameSpace)); - fmt.Fprintf (w, "#else // __%s_DLL\n", strings.ToUpper (NameSpace)); - fmt.Fprintf (w, "#define %s_DECLSPEC\n", strings.ToUpper (NameSpace)); - fmt.Fprintf (w, "#endif // __%s_DLL\n", strings.ToUpper (NameSpace)); - fmt.Fprintf (w, "\n"); - - fmt.Fprintf (w, "#include \"%s_types.h\"\n", BaseName); - fmt.Fprintf (w, "\n"); - - fmt.Fprintf (w, "extern \"C\" {\n"); - - for i := 0; i < len(component.Classes); i++ { - class := component.Classes[i]; - - fmt.Fprintf (w, "\n"); - fmt.Fprintf (w, "/*************************************************************************************************************************\n"); - fmt.Fprintf (w, " Class definition for %s\n", class.ClassName); - fmt.Fprintf (w, "**************************************************************************************************************************/\n"); - - for j := 0; j < len(class.Methods); j++ { - method := class.Methods[j]; - WriteCMethod (method, w, NameSpace, class.ClassName, false, false); - } - } - - - fmt.Fprintf (w, "\n"); - fmt.Fprintf (w, "/*************************************************************************************************************************\n"); - fmt.Fprintf (w, " Global functions\n"); - fmt.Fprintf (w, "**************************************************************************************************************************/\n"); - - global := component.Global; - for j := 0; j < len(global.Methods); j++ { - method := global.Methods[j]; - err := WriteCMethod (method, w, NameSpace, "Wrapper", true, false); - if (err != nil) { - return err; - } - } - - fmt.Fprintf (w, "\n"); - fmt.Fprintf (w, "}\n"); - fmt.Fprintf (w, "\n"); - fmt.Fprintf (w, "#endif // __%s_HEADER\n", strings.ToUpper (NameSpace)); - fmt.Fprintf (w, "\n"); - - return nil; -} - - -// GetCExportName How do we name the exports in the plain C DLL -func GetCExportName (NameSpace string, ClassName string, method ComponentDefinitionMethod, isGlobal bool) (string) { - CMethodName := ""; - if isGlobal { - CMethodName = fmt.Sprintf("%s_%s%s", strings.ToLower(NameSpace), strings.ToLower(method.MethodName), method.DLLSuffix) - } else { - CMethodName = fmt.Sprintf("%s_%s_%s%s", strings.ToLower(NameSpace), strings.ToLower(ClassName), strings.ToLower(method.MethodName), method.DLLSuffix) - } - - return CMethodName; -} - - -// WriteCMethod writes a method as a C funtion -func WriteCMethod (method ComponentDefinitionMethod, w io.Writer, NameSpace string, ClassName string, isGlobal bool, writeCallbacks bool) (error) { - - CMethodName := ""; - CCallbackName := ""; - parameters := ""; - if (isGlobal) { - CMethodName = fmt.Sprintf ("%s_%s%s", strings.ToLower (NameSpace), strings.ToLower (method.MethodName), method.DLLSuffix); - CCallbackName = fmt.Sprintf ("P%s%sPtr", NameSpace, method.MethodName); - } else { - CMethodName = fmt.Sprintf ("%s_%s_%s%s", strings.ToLower (NameSpace), strings.ToLower (ClassName), strings.ToLower (method.MethodName), method.DLLSuffix); - CCallbackName = fmt.Sprintf ("P%s%s_%sPtr", NameSpace, ClassName, method.MethodName); - parameters = fmt.Sprintf ("%s_%s p%s", NameSpace, ClassName, ClassName); - } - - fmt.Fprintf (w, "\n"); - fmt.Fprintf (w, "/**\n"); - fmt.Fprintf (w, "* %s\n", method.MethodDescription); - fmt.Fprintf (w, "*\n"); - if (!isGlobal) { - fmt.Fprintf (w, "* @param[in] p%s - %s instance.\n", ClassName, ClassName); - } - - - for k := 0; k < len(method.Params); k++ { - param := method.Params [k]; - - cParams, err := generateCParameter(param, ClassName, method.MethodName, NameSpace); - if (err != nil) { - return err; - } - - for _, cParam := range cParams { - fmt.Fprintf (w, cParam.ParamComment); - if (parameters != "") { - parameters = parameters + ", "; - } - parameters = parameters + cParam.ParamType + " " + cParam.ParamName; - } - - } - - fmt.Fprintf (w, "* @return error code or 0 (success)\n"); - fmt.Fprintf (w, "*/\n"); - - if (writeCallbacks) { - fmt.Fprintf (w, "typedef %sResult (*%s) (%s);\n", NameSpace, CCallbackName, parameters); - } else { - fmt.Fprintf (w, "%s_DECLSPEC %sResult %s (%s);\n", strings.ToUpper(NameSpace), NameSpace, CMethodName, parameters); - } - - return nil; -} - - -func getCParameterTypeName(ParamTypeName string, NameSpace string, ParamClass string)(string, error) { - cParamTypeName := ""; - switch (ParamTypeName) { - case "uint8": - cParamTypeName = "unsigned char"; - - case "uint16": - cParamTypeName = "unsigned short"; - - case "uint32": - cParamTypeName = "unsigned int"; - - case "uint64": - cParamTypeName = "unsigned long long"; - - case "int8": - cParamTypeName = "char"; - - case "int16": - cParamTypeName = "short"; - - case "int32": - cParamTypeName = "int"; - - case "int64": - cParamTypeName = "long long"; - - case "bool": - cParamTypeName = "bool"; - - case "single": - cParamTypeName = "float"; - - case "double": - cParamTypeName = "double"; - - case "string": - cParamTypeName = "char *"; - - case "enum": - cParamTypeName = fmt.Sprintf ("e%s%s", NameSpace, ParamClass); - - case "struct": - cParamTypeName = fmt.Sprintf ("s%s%s *", NameSpace, ParamClass); - - case "basicarray": - basicTypeName, err := getCParameterTypeName(ParamClass, NameSpace, ""); - if (err != nil) { - return "", err; - } - cParamTypeName = fmt.Sprintf ("%s *", basicTypeName); - - case "structarray": - cParamTypeName = fmt.Sprintf ("s%s%s *", NameSpace, ParamClass) - - case "handle": - cParamTypeName = fmt.Sprintf ("%s_%s", NameSpace, ParamClass) - - case "functiontype": - cParamTypeName = fmt.Sprintf ("%s%s", NameSpace, ParamClass) - - default: - return "", fmt.Errorf ("invalid parameter type \"%s\" for C-parameter", ParamTypeName); - } - - return cParamTypeName, nil; -} - -// CParameter is a handy representation of a function parameter in C -type CParameter struct { - ParamType string - ParamName string - ParamComment string -} - - -func generateCParameter(param ComponentDefinitionParam, className string, methodName string, NameSpace string) ([]CParameter, error) { - cParams := make([]CParameter,1) - cParamTypeName, err := getCParameterTypeName(param.ParamType, NameSpace, param.ParamClass); - if (err != nil) { - return nil, err; - } - - switch (param.ParamPass) { - case "in": - switch (param.ParamType) { - case "uint8", "uint16", "uint32", "uint64", "int8", "int16", "int32", "int64": - cParams[0].ParamType = cParamTypeName; - cParams[0].ParamName = "n" + param.ParamName; - cParams[0].ParamComment = fmt.Sprintf("* @param[in] %s - %s\n", cParams[0].ParamName, param.ParamDescription); - - case "bool": - cParams[0].ParamType = cParamTypeName; - cParams[0].ParamName = "b" + param.ParamName; - cParams[0].ParamComment = fmt.Sprintf("* @param[in] %s - %s\n", cParams[0].ParamName, param.ParamDescription); - - case "single": - cParams[0].ParamType = cParamTypeName; - cParams[0].ParamName = "f" + param.ParamName; - cParams[0].ParamComment = fmt.Sprintf("* @param[in] %s - %s\n", cParams[0].ParamName, param.ParamDescription); - - case "double": - cParams[0].ParamType = cParamTypeName; - cParams[0].ParamName = "d" + param.ParamName; - cParams[0].ParamComment = fmt.Sprintf("* @param[in] %s - %s\n", cParams[0].ParamName, param.ParamDescription); - - case "string": - cParams[0].ParamType = "const " + cParamTypeName; - cParams[0].ParamName = "p" + param.ParamName; - cParams[0].ParamComment = fmt.Sprintf("* @param[in] %s - %s\n", cParams[0].ParamName, param.ParamDescription); - - case "enum": - cParams[0].ParamType = cParamTypeName; - cParams[0].ParamName = "e" + param.ParamName; - cParams[0].ParamComment = fmt.Sprintf("* @param[in] %s - %s\n", cParams[0].ParamName, param.ParamDescription); - - case "struct": - cParams[0].ParamType = "const " + cParamTypeName; - cParams[0].ParamName = "p" + param.ParamName; - cParams[0].ParamComment = fmt.Sprintf("* @param[in] %s - %s\n", cParams[0].ParamName, param.ParamDescription); - - case "basicarray", "structarray": - cParams = make([]CParameter,2) - cParams[0].ParamType = "const unsigned int"; - cParams[0].ParamName = "n" + param.ParamName + "BufferSize"; - cParams[0].ParamComment = fmt.Sprintf("* @param[in] %s - Number of elements in buffer\n", cParams[0].ParamName); - - cParams[1].ParamType = "const " + cParamTypeName; - cParams[1].ParamName = "p" + param.ParamName + "Buffer"; - cParams[1].ParamComment = fmt.Sprintf("* @param[in] %s - %s buffer of %s\n", cParams[1].ParamName, param.ParamClass, param.ParamDescription); - - case "handle": - cParams[0].ParamType = cParamTypeName; - cParams[0].ParamName = "p" + param.ParamName; - cParams[0].ParamComment = fmt.Sprintf("* @param[in] %s - %s\n", cParams[0].ParamName, param.ParamDescription); - - case "functiontype": - cParams[0].ParamType = cParamTypeName; - cParams[0].ParamName = "p" + param.ParamName; - cParams[0].ParamComment = fmt.Sprintf("* @param[in] %s - %s\n", cParams[0].ParamName, param.ParamDescription); - - default: - return nil, fmt.Errorf ("invalid method parameter type \"%s\" for %s.%s (%s)", param.ParamType, className, methodName, param.ParamName); - } - - case "out", "return": - - switch (param.ParamType) { - - case "uint8", "uint16", "uint32", "uint64", "int8", "int16", "int32", "int64", "bool", "single", "double", "enum": - cParams[0].ParamType = cParamTypeName + " *"; - cParams[0].ParamName = "p" + param.ParamName; - cParams[0].ParamComment = fmt.Sprintf("* @param[out] %s - %s\n", cParams[0].ParamName, param.ParamDescription); - - case "struct": - cParams[0].ParamType = cParamTypeName; - cParams[0].ParamName = "p" + param.ParamName; - cParams[0].ParamComment = fmt.Sprintf("* @param[out] %s - %s\n", cParams[0].ParamName, param.ParamDescription); - - case "basicarray", "structarray": - cParams = make([]CParameter,3) - cParams[0].ParamType = "const unsigned int"; - cParams[0].ParamName = "n" + param.ParamName + "BufferSize"; - cParams[0].ParamComment = fmt.Sprintf("* @param[in] %s - Number of elements in buffer\n", cParams[0].ParamName); - - cParams[1].ParamType = "unsigned int *"; - cParams[1].ParamName = "p" + param.ParamName + "NeededCount"; - cParams[1].ParamComment = fmt.Sprintf("* @param[out] %s - will be filled with the count of the written elements, or needed buffer size.\n", cParams[1].ParamName); - - cParams[2].ParamType = cParamTypeName; - cParams[2].ParamName = "p" + param.ParamName + "Buffer"; - cParams[2].ParamComment = fmt.Sprintf("* @param[out] %s - %s buffer of %s\n", cParams[2].ParamName, param.ParamClass, param.ParamDescription); - - case "string": - cParams = make([]CParameter,3) - cParams[0].ParamType = "const unsigned int"; - cParams[0].ParamName = "n" + param.ParamName + "BufferSize"; - cParams[0].ParamComment = fmt.Sprintf("* @param[in] %s - size of the buffer (including trailing 0)\n", cParams[0].ParamName); - - cParams[1].ParamType = "unsigned int *"; - cParams[1].ParamName = "p" + param.ParamName + "NeededChars"; - cParams[1].ParamComment = fmt.Sprintf("* @param[out] %s - will be filled with the count of the written bytes, or needed buffer size.\n", cParams[1].ParamName); - - cParams[2].ParamType = cParamTypeName; - cParams[2].ParamName = "p" + param.ParamName + "Buffer"; - cParams[2].ParamComment = fmt.Sprintf("* @param[out] %s - %s buffer of %s, may be NULL\n", cParams[2].ParamName, param.ParamClass, param.ParamDescription); - - case "handle": - cParams[0].ParamType = cParamTypeName + " *"; - cParams[0].ParamName = "p" + param.ParamName; - cParams[0].ParamComment = fmt.Sprintf("* @param[out] %s - %s\n", cParams[0].ParamName, param.ParamDescription); - - default: - return nil, fmt.Errorf ("invalid method parameter type \"%s\" for %s.%s (%s)", param.ParamType, className, methodName, param.ParamName); - } - - default: - return nil, fmt.Errorf ("invalid method parameter passing \"%s\" for %s.%s (%s)", param.ParamPass, className, methodName, param.ParamName); - } - - return cParams, nil; -} - -// GenerateCParameters generates an array of cParameters for a method -func GenerateCParameters(method ComponentDefinitionMethod, className string, NameSpace string) ([]CParameter, error) { - parameters := []CParameter{}; - for k := 0; k < len(method.Params); k++ { - param := method.Params [k]; - - cParam, err := generateCParameter(param, className, method.MethodName, NameSpace); - if err != nil { - return nil, err; - } - parameters = append(parameters, cParam...); - } - - return parameters, nil; -} \ No newline at end of file From e6dd1e6f57e3ddf893263a64a5007a95652b78ab Mon Sep 17 00:00:00 2001 From: Martin Weismann Date: Mon, 17 Dec 2018 13:37:17 +0100 Subject: [PATCH 06/22] Remove stray build.bat-file --- build.bat | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 build.bat diff --git a/build.bat b/build.bat deleted file mode 100644 index a2c93974..00000000 --- a/build.bat +++ /dev/null @@ -1,11 +0,0 @@ -@echo off -cd Source -set Sources=actutils.go automaticcomponenttoolkit.go buildbindingcdynamic.go buildbindingcpp.go buildbindinggo.go buildbindingnode.go buildbindingpascal.go buildbindingpython.go buildimplementationcpp.go buildimplementationpascal.go componentdefinition.go languagewriter.go languagec.go languagepascal.go -set GOOS=windows -set GOARCH=amd64 -go build -o ..\act.exe %Sources% -set GOOS=linux -go build -o ..\act.linux %Sources% -set GOOS=darwin -go build -o ..\act.darwin %Sources% -cd .. \ No newline at end of file From ec5f84afcf8e45b5bab4626a5b099378416ed4e9 Mon Sep 17 00:00:00 2001 From: Martin Weismann <30837766+martinweismann@users.noreply.github.com> Date: Mon, 17 Dec 2018 16:08:08 +0100 Subject: [PATCH 07/22] Setup Travis builds (#3) * Add travis-setup * Add status in README --- .travis.yml | 22 ++++++++++++++++++++++ README.md | 2 ++ 2 files changed, 24 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..5673f522 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,22 @@ +# Configuration file for Travis CI (https://travis-ci.org) +# +# It used as a status check for all PRs and +# to generate the build-status-icon in the main README.md-file. + +language: go + +go: + - 1.11.x + +matrix: + include: + - os: linux + compiler: gcc + - os: osx + osx_image: xcode7.2 + +before_script: + - cd Build + +script: + - sh build.sh diff --git a/README.md b/README.md index f003f94d..a7e4ef72 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ # Automatic Component Toolkit +[![Build Status](https://travis-ci.org/Autodesk/AutomaticComponentToolkit.svg?branch=develop)](https://travis-ci.org/Autodesk/AutomaticComponentToolkit) + The Automatic Component Toolkit (ACT) is a code generator that takes an instance of an [Interface Description Language](#interface-description-language-idl) file and generates a [thin C89-API](#thin-c89-api), [implementation stubs](#implementation-stubs) and [language bindings](#language-bindings) of your desired software component. From 2d63fd551d9ea7a6912ebe2464d383582bb8b26f Mon Sep 17 00:00:00 2001 From: Sebastian Pichlmeier Date: Tue, 18 Dec 2018 10:43:04 +0100 Subject: [PATCH 08/22] Fix issue in pascal implementation generation (#5) Type for local variable was not correct for pascal implementation functions with struct return type. --- Source/buildimplementationpascal.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/buildimplementationpascal.go b/Source/buildimplementationpascal.go index a9d45572..cd19e816 100644 --- a/Source/buildimplementationpascal.go +++ b/Source/buildimplementationpascal.go @@ -605,7 +605,7 @@ func generatePrePostCallPascalFunctionCode(method ComponentDefinitionMethod, Nam checkInputCode = append (checkInputCode, fmt.Sprintf("if not Assigned (%s) then", pascalParams[0].ParamName)) checkInputCode = append (checkInputCode, fmt.Sprintf(" raise E%sException.Create (%s_ERROR_INVALIDPARAM);", NameSpace, strings.ToUpper(NameSpace))) - variableDefinitions = append (variableDefinitions, fmt.Sprintf (" Result%s: %s;", param.ParamName, pascalParams[0].ParamType)); + variableDefinitions = append (variableDefinitions, fmt.Sprintf (" Result%s: T%s%s;", param.ParamName, NameSpace, param.ParamClass)); postCallCode = append (postCallCode, fmt.Sprintf("%s^ := Result%s;", pascalParams[0].ParamName, param.ParamName)) From c5aa29fcc2b2076cb4e8d6e582de85df034396fb Mon Sep 17 00:00:00 2001 From: Martin Weismann Date: Tue, 18 Dec 2018 12:30:02 +0100 Subject: [PATCH 09/22] Fix Pascal out/return bool values --- Source/languagepascal.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/languagepascal.go b/Source/languagepascal.go index 933d791a..d4a59ec9 100644 --- a/Source/languagepascal.go +++ b/Source/languagepascal.go @@ -241,7 +241,7 @@ func getPascalParameterType(ParamTypeName string, NameSpace string, ParamClass s case "bool": if isPlain { - PascalParamTypeName = "Cardinal"; + PascalParamTypeName = "Byte"; } else { PascalParamTypeName = "Boolean"; } From 643e14ce01ef6c98a95f06d5f92d4e1448462043 Mon Sep 17 00:00:00 2001 From: Martin Weismann Date: Wed, 19 Dec 2018 10:17:51 +0100 Subject: [PATCH 10/22] Describe size of bool in thin API layer --- Documentation/IDL.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Documentation/IDL.md b/Documentation/IDL.md index bf8da196..f772b850 100644 --- a/Documentation/IDL.md +++ b/Documentation/IDL.md @@ -318,6 +318,11 @@ TODO: add all simple types here. ST_Type `string` denotes a null-terminated string. If a component requires arbitrary strings that can contain null-characters, on should use the type `basicarray` of class `uint8`. ### 17.2 ScalarType +ST_ScalarType `bool` denotes a boolean value (`true` or `false`). +Although this can be encoded in a single bit, the thin C89-layer APIs generated by ACT will use a unsigned 8 bit value (a `uint8` in ACT terms) to encode a boolean value. +A numerical value of `0` encodes `false`, all oher values encode `true`. +Implementations and bindings should use the definition of a boolean value native to the respective language of the implementation or binding. + ### 17.3 ComposedType ### 17.4 Name ### 17.5 Description From 0b791bda173aa9f24bb492fad28b032039350f3f Mon Sep 17 00:00:00 2001 From: Martin Weismann Date: Wed, 19 Dec 2018 10:22:48 +0100 Subject: [PATCH 11/22] Make Pascal use byte for bool-members of structs --- Source/languagepascal.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/languagepascal.go b/Source/languagepascal.go index d4a59ec9..351d290f 100644 --- a/Source/languagepascal.go +++ b/Source/languagepascal.go @@ -137,7 +137,7 @@ func writePascalBaseTypeDefinitions(componentdefinition ComponentDefinition, w L w.Writeln ( " F%s: %sWord;", element.Name, arrayprefix); case "uint32": w.Writeln ( " F%s: %sCardinal;", element.Name, arrayprefix); - case "uint64": + case "uint64": w.Writeln ( " F%s: %sQWord;", element.Name, arrayprefix); case "int8": w.Writeln ( " F%s: %sSmallInt;", element.Name, arrayprefix); @@ -145,10 +145,10 @@ func writePascalBaseTypeDefinitions(componentdefinition ComponentDefinition, w L w.Writeln ( " F%s: %sShortInt;", element.Name, arrayprefix); case "int32": w.Writeln ( " F%s: %sInteger;", element.Name, arrayprefix); - case "int64": + case "int64": w.Writeln ( " F%s: %sInt64;", element.Name, arrayprefix); - case "bool": - w.Writeln ( " F%s: %sCardinal;", element.Name, arrayprefix); + case "bool": + w.Writeln ( " F%s: %sByte;", element.Name, arrayprefix); case "single": w.Writeln ( " F%s: %sSingle;", element.Name, arrayprefix); case "double": From 66de541e0a17921d27bcae663d42e56b5affa68b Mon Sep 17 00:00:00 2001 From: Tristan Barback <45997751+tristanbarback@users.noreply.github.com> Date: Wed, 19 Dec 2018 17:29:42 +0000 Subject: [PATCH 12/22] Fix looser throw specifier error (#6) GCC reports a "looser throw specifier" error when attempting to compile the generated interface exception class. A noexcept specifier has been used in the generated binding for exceptions, but not in the interface class. I haven't tested this change (as I'm not set up to build ACT), but I am only changing strings and I've checked the changed strings build on MSVC/GCC --- Source/buildimplementationcpp.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/buildimplementationcpp.go b/Source/buildimplementationcpp.go index ff02f884..3c568dba 100644 --- a/Source/buildimplementationcpp.go +++ b/Source/buildimplementationcpp.go @@ -221,7 +221,7 @@ func buildCPPInternalException (wHeader LanguageWriter, wImpl LanguageWriter, Na wHeader.Writeln(" /**"); wHeader.Writeln(" * Returns error message"); wHeader.Writeln(" */"); - wHeader.Writeln(" const char* what () const;"); + wHeader.Writeln(" const char* what () const noexcept override;"); wHeader.Writeln("};"); wHeader.Writeln(""); @@ -248,7 +248,7 @@ func buildCPPInternalException (wHeader LanguageWriter, wImpl LanguageWriter, Na wImpl.Writeln(" return m_errorCode;"); wImpl.Writeln("}"); wImpl.Writeln(""); - wImpl.Writeln("const char * E%sInterfaceException::what () const", NameSpace); + wImpl.Writeln("const char * E%sInterfaceException::what () const noexcept", NameSpace); wImpl.Writeln("{"); wImpl.Writeln(" return m_errorMessage.c_str();"); wImpl.Writeln("}"); From 6b5a502e2a47db4344800fcf9e1d7d8869f0f862 Mon Sep 17 00:00:00 2001 From: Martin Weismann Date: Thu, 20 Dec 2018 08:37:04 +0100 Subject: [PATCH 13/22] Fix Primes example under Unix --- .../Examples/CppDynamic/LibPrimes_example.cpp | 3 ++- .../Cpp/Interfaces/libprimes_interfaceexception.cpp | 2 +- .../Cpp/Interfaces/libprimes_interfaceexception.hpp | 2 +- .../Implementations/Cpp/Stub/libprimes_calculator.cpp | 4 ++-- .../Implementations/Cpp/Stub/libprimes_calculator.hpp | 6 +++--- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Examples/Primes/LibPrimes_component/Examples/CppDynamic/LibPrimes_example.cpp b/Examples/Primes/LibPrimes_component/Examples/CppDynamic/LibPrimes_example.cpp index e1b37717..70381478 100644 --- a/Examples/Primes/LibPrimes_component/Examples/CppDynamic/LibPrimes_example.cpp +++ b/Examples/Primes/LibPrimes_component/Examples/CppDynamic/LibPrimes_example.cpp @@ -12,11 +12,12 @@ Interface version: 1.0.0 #include #include "libprimes_dynamic.hpp" +#include void progressCallback(float progress, bool* shouldAbort) { - std::cout << "Progress = " << round(progress * 100) << "%" << std::endl; + std::cout << "Progress = " << std::round(progress * 100) << "%" << std::endl; if (shouldAbort) { *shouldAbort = progress > 0.5; } diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.cpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.cpp index 6e08f9df..7c91e0cc 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.cpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.cpp @@ -32,7 +32,7 @@ LibPrimesResult ELibPrimesInterfaceException::getErrorCode () return m_errorCode; } -const char * ELibPrimesInterfaceException::what () const +const char * ELibPrimesInterfaceException::what () const noexcept { return m_errorMessage.c_str(); } diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.hpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.hpp index c1450d91..e90a1880 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.hpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.hpp @@ -49,7 +49,7 @@ class ELibPrimesInterfaceException : public std::exception { /** * Returns error message */ - const char* what () const; + const char* what () const noexcept override; }; #endif // __LIBPRIMES_INTERFACEEXCEPTION_HEADER diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.cpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.cpp index 85cb285b..dd5ea13b 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.cpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.cpp @@ -27,12 +27,12 @@ CLibPrimesCalculator::CLibPrimesCalculator() } -unsigned long long CLibPrimesCalculator::GetValue() +LibPrimes_uint64 CLibPrimesCalculator::GetValue() { return m_value; } -void CLibPrimesCalculator::SetValue(const unsigned long long nValue) +void CLibPrimesCalculator::SetValue(const LibPrimes_uint64 nValue) { m_value = nValue; } diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.hpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.hpp index a7d08109..4707a113 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.hpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.hpp @@ -30,7 +30,7 @@ class CLibPrimesCalculator : public virtual ILibPrimesCalculator { protected: - unsigned long long m_value; + LibPrimes_uint64 m_value; LibPrimesProgressCallback m_Callback; public: @@ -43,9 +43,9 @@ class CLibPrimesCalculator : public virtual ILibPrimesCalculator { /** * Public member functions to implement. */ - unsigned long long GetValue(); + LibPrimes_uint64 GetValue(); - void SetValue(const unsigned long long nValue); + void SetValue(const LibPrimes_uint64 nValue); void SetProgressCallback (const LibPrimesProgressCallback pProgressCallback); From 460dfa1f88172594e7e31355547203fc988ddc6e Mon Sep 17 00:00:00 2001 From: Martin Weismann Date: Mon, 7 Jan 2019 13:17:38 +0100 Subject: [PATCH 14/22] Add Nested NameSpace in C++-Implementation This is to avoid clashes of symbols between CPP-implementation and binding. --- .../Cpp/Interfaces/libprimes_interfaces.hpp | 4 +- .../Interfaces/libprimes_interfacewrapper.cpp | 2 +- .../Implementations/Cpp/Stub/libprimes.cpp | 2 +- .../Cpp/Stub/libprimes_calculator.cpp | 2 +- .../Cpp/Stub/libprimes_calculator.hpp | 4 +- .../libprimes_factorizationcalculator.cpp | 2 +- .../libprimes_factorizationcalculator.hpp | 8 ++- .../Cpp/Stub/libprimes_sievecalculator.cpp | 2 +- .../Cpp/Stub/libprimes_sievecalculator.hpp | 5 +- Source/buildimplementationcpp.go | 65 ++++++++++--------- 10 files changed, 54 insertions(+), 42 deletions(-) diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaces.hpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaces.hpp index dce9a1f8..c45b8678 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaces.hpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaces.hpp @@ -23,6 +23,7 @@ Interface version: 1.2.0 #include "libprimes_types.h" namespace LibPrimes { +namespace Impl { /** Forward declarations of class interfaces @@ -147,6 +148,7 @@ class CLibPrimesWrapper { }; -} +} // namespace Impl +} // namespace LibPrimes #endif // __LIBPRIMES_CPPINTERFACES diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacewrapper.cpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacewrapper.cpp index a5fe44b2..4ae7885c 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacewrapper.cpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacewrapper.cpp @@ -18,7 +18,7 @@ Interface version: 1.2.0 #include "libprimes_interfaceexception.hpp" #include "libprimes_interfacejournal.hpp" -using namespace LibPrimes; +using namespace LibPrimes::Impl; PLibPrimesInterfaceJournal m_GlobalJournal; diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes.cpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes.cpp index f4425dce..dd4d3ac8 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes.cpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes.cpp @@ -16,7 +16,7 @@ development of Prime Numbers Interface. It needs to be generated only once. #include "libprimes_factorizationcalculator.hpp" #include "libprimes_sievecalculator.hpp" -using namespace LibPrimes; +using namespace LibPrimes::Impl; ILibPrimesFactorizationCalculator * CLibPrimesWrapper::CreateFactorizationCalculator () { diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.cpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.cpp index dd5ea13b..b2bebf49 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.cpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.cpp @@ -14,7 +14,7 @@ Abstract: This is a stub class definition of CLibPrimesCalculator // Include custom headers here. -using namespace LibPrimes; +using namespace LibPrimes::Impl; /************************************************************************************************************************* Class definition of CLibPrimesCalculator diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.hpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.hpp index 4707a113..7942d503 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.hpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.hpp @@ -19,6 +19,7 @@ Abstract: This is the class declaration of CLibPrimesCalculator namespace LibPrimes { +namespace Impl { /************************************************************************************************************************* @@ -52,6 +53,7 @@ class CLibPrimesCalculator : public virtual ILibPrimesCalculator { virtual void Calculate () = 0; }; -} +} // namespace Impl +} // namespace LibPrimes #endif // __LIBPRIMES_LIBPRIMESCALCULATOR diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.cpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.cpp index 66c92d66..913e1e81 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.cpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.cpp @@ -14,7 +14,7 @@ Abstract: This is a stub class definition of CLibPrimesFactorizationCalculator // Include custom headers here. -using namespace LibPrimes; +using namespace LibPrimes::Impl; /************************************************************************************************************************* Class definition of CLibPrimesFactorizationCalculator diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.hpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.hpp index 316acb3e..93c75a7f 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.hpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.hpp @@ -23,10 +23,11 @@ Abstract: This is the class declaration of CLibPrimesFactorizationCalculator #include namespace LibPrimes { +namespace Impl { /************************************************************************************************************************* - Class declaration of CLibPrimesFactorizationCalculator + Class declaration of CLibPrimesFactorizationCalculator **************************************************************************************************************************/ class CLibPrimesFactorizationCalculator : public virtual ILibPrimesFactorizationCalculator, public virtual CLibPrimesCalculator { @@ -52,10 +53,11 @@ class CLibPrimesFactorizationCalculator : public virtual ILibPrimesFactorization * Public member functions to implement. */ - void GetPrimeFactors (LibPrimes_uint64 nPrimeFactorsBufferSize, LibPrimes_uint64 * pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer); + void GetPrimeFactors(LibPrimes_uint64 nPrimeFactorsBufferSize, LibPrimes_uint64 * pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer); }; -} +} // namespace Impl +} // namespace LibPrimes #pragma warning( pop ) #endif // __LIBPRIMES_LIBPRIMESFACTORIZATIONCALCULATOR diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_sievecalculator.cpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_sievecalculator.cpp index 71886609..8faa88d5 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_sievecalculator.cpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_sievecalculator.cpp @@ -15,7 +15,7 @@ Abstract: This is a stub class definition of CLibPrimesSieveCalculator #include -using namespace LibPrimes; +using namespace LibPrimes::Impl; /************************************************************************************************************************* Class definition of CLibPrimesSieveCalculator diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_sievecalculator.hpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_sievecalculator.hpp index b708e4e4..280ba983 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_sievecalculator.hpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_sievecalculator.hpp @@ -24,7 +24,7 @@ Abstract: This is the class declaration of CLibPrimesSieveCalculator #include namespace LibPrimes { - +namespace Impl { /************************************************************************************************************************* Class declaration of CLibPrimesSieveCalculator @@ -53,7 +53,8 @@ class CLibPrimesSieveCalculator : public virtual ILibPrimesSieveCalculator, publ }; -} +} // namespace Impl +} // namespace LibPrimes #pragma warning( pop ) #endif // __LIBPRIMES_LIBPRIMESSIEVECALCULATOR diff --git a/Source/buildimplementationcpp.go b/Source/buildimplementationcpp.go index 3c568dba..6d9ab6b0 100644 --- a/Source/buildimplementationcpp.go +++ b/Source/buildimplementationcpp.go @@ -47,9 +47,10 @@ func BuildImplementationCPP(component ComponentDefinition, outputFolder string, doJournal := len (component.Global.JournalMethod) > 0; - namespace := component.NameSpace; - libraryname := component.LibraryName; - baseName := component.BaseName; + NameSpace := component.NameSpace; + ImplementationSubNameSpace := "Impl" + LibraryName := component.LibraryName; + BaseName := component.BaseName; indentString := getIndentationString(implementation.Indentation) stubIdentifier := "" @@ -57,78 +58,78 @@ func BuildImplementationCPP(component ComponentDefinition, outputFolder string, stubIdentifier = "_" + strings.ToLower(implementation.StubIdentifier) } - IntfExceptionHeaderName := path.Join(outputFolder, baseName+"_interfaceexception.hpp"); + IntfExceptionHeaderName := path.Join(outputFolder, BaseName+"_interfaceexception.hpp"); log.Printf("Creating \"%s\"", IntfExceptionHeaderName) hInternalExceptionHeaderFile, err := CreateLanguageFile (IntfExceptionHeaderName, indentString) if err != nil { return err } hInternalExceptionHeaderFile.WriteCLicenseHeader(component, - fmt.Sprintf("This is an autogenerated C++ Header file with the basic internal\n exception type in order to allow an easy use of %s", libraryname), + fmt.Sprintf("This is an autogenerated C++ Header file with the basic internal\n exception type in order to allow an easy use of %s", LibraryName), true) - IntfExceptionImplName := path.Join(outputFolder, baseName+"_interfaceexception.cpp"); + IntfExceptionImplName := path.Join(outputFolder, BaseName+"_interfaceexception.cpp"); log.Printf("Creating \"%s\"", IntfExceptionImplName) hInternalExceptionImplFile, err := CreateLanguageFile (IntfExceptionImplName, indentString) if err != nil { return err } hInternalExceptionImplFile.WriteCLicenseHeader(component, - fmt.Sprintf("This is an autogenerated C++ Implementation file with the basic internal\n exception type in order to allow an easy use of %s", libraryname), + fmt.Sprintf("This is an autogenerated C++ Implementation file with the basic internal\n exception type in order to allow an easy use of %s", LibraryName), true) - err = buildCPPInternalException(hInternalExceptionHeaderFile, hInternalExceptionImplFile, namespace, baseName ) + err = buildCPPInternalException(hInternalExceptionHeaderFile, hInternalExceptionImplFile, NameSpace, BaseName ) if err != nil { return err } - IntfHeaderName := path.Join(outputFolder, baseName+"_interfaces.hpp"); + IntfHeaderName := path.Join(outputFolder, BaseName+"_interfaces.hpp"); log.Printf("Creating \"%s\"", IntfHeaderName) interfaceshppfile, err := CreateLanguageFile (IntfHeaderName, indentString) if err != nil { return err } interfaceshppfile.WriteCLicenseHeader(component, - fmt.Sprintf("This is an autogenerated C++ header file in order to allow easy\ndevelopment of %s. The implementer of %s needs to\nderive concrete classes from the abstract classes in this header.", libraryname, libraryname), + fmt.Sprintf("This is an autogenerated C++ header file in order to allow easy\ndevelopment of %s. The implementer of %s needs to\nderive concrete classes from the abstract classes in this header.", LibraryName, LibraryName), true) - err = buildCPPInterfaces(component, interfaceshppfile, namespace, implementation.ClassIdentifier, baseName) + err = buildCPPInterfaces(component, interfaceshppfile, NameSpace, ImplementationSubNameSpace, implementation.ClassIdentifier, BaseName) if err != nil { return err } - IntfWrapperImplName := path.Join(outputFolder, baseName+"_interfacewrapper.cpp"); + IntfWrapperImplName := path.Join(outputFolder, BaseName+"_interfacewrapper.cpp"); log.Printf("Creating \"%s\"", IntfWrapperImplName) cppWrapperfile, err := CreateLanguageFile(IntfWrapperImplName, indentString) if err != nil { return err } cppWrapperfile.WriteCLicenseHeader(component, - fmt.Sprintf("This is an autogenerated C++ implementation file in order to allow easy\ndevelopment of %s. The functions in this file need to be implemented. It needs to be generated only once.", libraryname), + fmt.Sprintf("This is an autogenerated C++ implementation file in order to allow easy\ndevelopment of %s. The functions in this file need to be implemented. It needs to be generated only once.", LibraryName), true) - err = buildCPPInterfaceWrapper(component, cppWrapperfile, namespace, implementation.ClassIdentifier, baseName, doJournal) + err = buildCPPInterfaceWrapper(component, cppWrapperfile, NameSpace, implementation.ClassIdentifier, BaseName, doJournal) if err != nil { return err } if (doJournal) { - IntfJournalHeaderName := path.Join(outputFolder, baseName+"_interfacejournal.hpp"); + IntfJournalHeaderName := path.Join(outputFolder, BaseName+"_interfacejournal.hpp"); log.Printf("Creating \"%s\"", IntfJournalHeaderName) interfacejournalhppfile, err := CreateLanguageFile (IntfJournalHeaderName, indentString) if err != nil { return err } interfacejournalhppfile.WriteCLicenseHeader(component, - fmt.Sprintf("This is an autogenerated C++ header file in order to allow easy\ndevelopment of %s. It provides an automatic Journaling mechanism for the library implementation.", libraryname), + fmt.Sprintf("This is an autogenerated C++ header file in order to allow easy\ndevelopment of %s. It provides an automatic Journaling mechanism for the library implementation.", LibraryName), true) - IntfJournalImplName := path.Join(outputFolder, baseName+"_interfacejournal.cpp"); + IntfJournalImplName := path.Join(outputFolder, BaseName+"_interfacejournal.cpp"); log.Printf("Creating \"%s\"", IntfJournalImplName) interfacejournalcppfile, err := CreateLanguageFile(IntfJournalImplName, indentString) if err != nil { return err } interfacejournalcppfile.WriteCLicenseHeader(component, - fmt.Sprintf("This is an autogenerated C++ implementation file in order to allow easy\ndevelopment of %s. It provides an automatic Journaling mechanism for the library implementation.", libraryname), + fmt.Sprintf("This is an autogenerated C++ implementation file in order to allow easy\ndevelopment of %s. It provides an automatic Journaling mechanism for the library implementation.", LibraryName), true) err = buildJournalingCPP(component, interfacejournalhppfile, interfacejournalcppfile) @@ -137,12 +138,12 @@ func BuildImplementationCPP(component ComponentDefinition, outputFolder string, } } - err = buildCPPStub(component, namespace, implementation.ClassIdentifier, baseName, stubOutputFolder, indentString, stubIdentifier, forceRecreation) + err = buildCPPStub(component, NameSpace, ImplementationSubNameSpace, implementation.ClassIdentifier, BaseName, stubOutputFolder, indentString, stubIdentifier, forceRecreation) if err != nil { return err } - IntfWrapperStubName := path.Join(stubOutputFolder, baseName + stubIdentifier + ".cpp") + IntfWrapperStubName := path.Join(stubOutputFolder, BaseName + stubIdentifier + ".cpp") if forceRecreation || (!FileExists(IntfWrapperStubName) ) { log.Printf("Creating \"%s\"", IntfWrapperStubName) stubfile, err := CreateLanguageFile (IntfWrapperStubName, indentString) @@ -150,10 +151,10 @@ func BuildImplementationCPP(component ComponentDefinition, outputFolder string, return err } stubfile.WriteCLicenseHeader(component, - fmt.Sprintf("This is an autogenerated C++ implementation file in order to allow easy\ndevelopment of %s. It needs to be generated only once.", libraryname), + fmt.Sprintf("This is an autogenerated C++ implementation file in order to allow easy\ndevelopment of %s. It needs to be generated only once.", LibraryName), true) - err = buildCPPGlobalStubFile(component, stubfile, namespace, implementation.ClassIdentifier, baseName) + err = buildCPPGlobalStubFile(component, stubfile, NameSpace, ImplementationSubNameSpace, implementation.ClassIdentifier, BaseName) if err != nil { return err } @@ -170,7 +171,7 @@ func BuildImplementationCPP(component ComponentDefinition, outputFolder string, return err } CMakeListsFile.WriteCMakeLicenseHeader(component, - fmt.Sprintf("This is an autogenerated CMakeLists file for the development of %s.", libraryname), + fmt.Sprintf("This is an autogenerated CMakeLists file for the development of %s.", LibraryName), true) buildCMakeForCPPImplementation(component, CMakeListsFile, doJournal) } else { @@ -258,7 +259,7 @@ func buildCPPInternalException (wHeader LanguageWriter, wImpl LanguageWriter, Na } -func buildCPPInterfaces(component ComponentDefinition, w LanguageWriter, NameSpace string, ClassIdentifier string, BaseName string) error { +func buildCPPInterfaces(component ComponentDefinition, w LanguageWriter, NameSpace string, NameSpaceImplementation string, ClassIdentifier string, BaseName string) error { w.Writeln("") w.Writeln("#ifndef __%s_CPPINTERFACES", strings.ToUpper(NameSpace)) w.Writeln("#define __%s_CPPINTERFACES", strings.ToUpper(NameSpace)) @@ -270,6 +271,7 @@ func buildCPPInterfaces(component ComponentDefinition, w LanguageWriter, NameSpa w.Writeln("") w.Writeln("namespace %s {", NameSpace) + w.Writeln("namespace %s {", NameSpaceImplementation) w.Writeln("") w.Writeln("/**") @@ -343,7 +345,8 @@ func buildCPPInterfaces(component ComponentDefinition, w LanguageWriter, NameSpa } w.Writeln("};") w.Writeln("") - w.Writeln("}") + w.Writeln("} // namespace %s", NameSpaceImplementation) + w.Writeln("} // namespace %s", NameSpace) w.Writeln("") w.Writeln("#endif // __%s_CPPINTERFACES", strings.ToUpper(NameSpace)) @@ -351,12 +354,12 @@ func buildCPPInterfaces(component ComponentDefinition, w LanguageWriter, NameSpa return nil } -func buildCPPGlobalStubFile(component ComponentDefinition, stubfile LanguageWriter, NameSpace string, ClassIdentifier string, BaseName string) error { +func buildCPPGlobalStubFile(component ComponentDefinition, stubfile LanguageWriter, NameSpace string, NameSpaceImplementation string, ClassIdentifier string, BaseName string) error { stubfile.Writeln("#include \"%s.h\"", BaseName) stubfile.Writeln("#include \"%s_interfaces.hpp\"", BaseName) stubfile.Writeln("#include \"%s_interfaceexception.hpp\"", BaseName) stubfile.Writeln("") - stubfile.Writeln("using namespace %s;", NameSpace) + stubfile.Writeln("using namespace %s::%s;", NameSpace, NameSpaceImplementation) stubfile.Writeln("") for j := 0; j < len(component.Global.Methods); j++ { @@ -560,7 +563,7 @@ func writeCImplementationMethod(method ComponentDefinitionMethod, w LanguageWrit return nil } -func buildCPPStub(component ComponentDefinition, NameSpace string, ClassIdentifier string, BaseName string, outputFolder string, indentString string, stubIdentifier string, forceRecreation bool) error { +func buildCPPStub(component ComponentDefinition, NameSpace string, NameSpaceImplementation string, ClassIdentifier string, BaseName string, outputFolder string, indentString string, stubIdentifier string, forceRecreation bool) error { for i := 0; i < len(component.Classes); i++ { class := component.Classes[i] @@ -613,6 +616,7 @@ func buildCPPStub(component ComponentDefinition, NameSpace string, ClassIdentifi stubheaderw.Writeln("") stubheaderw.Writeln("namespace %s {", NameSpace) + stubheaderw.Writeln("namespace Impl {") stubheaderw.Writeln("") stubheaderw.Writeln("") @@ -659,7 +663,7 @@ func buildCPPStub(component ComponentDefinition, NameSpace string, ClassIdentifi stubimplw.Writeln("") - stubimplw.Writeln("using namespace %s;", NameSpace) + stubimplw.Writeln("using namespace %s::%s;", NameSpace, NameSpaceImplementation) stubimplw.Writeln("") stubimplw.Writeln("/*************************************************************************************************************************") @@ -686,7 +690,8 @@ func buildCPPStub(component ComponentDefinition, NameSpace string, ClassIdentifi stubheaderw.Writeln("};") stubheaderw.Writeln("") - stubheaderw.Writeln("}") + stubheaderw.Writeln("} // namespace %s", NameSpaceImplementation) + stubheaderw.Writeln("} // namespace %s", NameSpace) stubheaderw.Writeln("") if class.ParentClass != "" { From a6406fa27eda573962091453e764c2f1457325ed Mon Sep 17 00:00:00 2001 From: Martin Weismann Date: Mon, 7 Jan 2019 14:52:15 +0100 Subject: [PATCH 15/22] Specify Python version (3) --- README.md | 4 ++-- Source/buildbindingpython.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a7e4ef72..c0f883b3 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ The Automatic Component Toolkit is an open source project. Contributions are welcome and we are looking for people that can improve existing language bindings or create new bindings or implementation stubs. Have a look at the [contributor's guide](CONTRIBUTING.md) for details. ## Language Support -ACT supports generation of bindings or implementation stubs for C++, C, Pascal, Golang, NodeJS and Python. However, not all features of the IDL are yet supported by the individual binding or implementation language: +ACT supports generation of bindings or implementation stubs for C++, C, Pascal, Golang, NodeJS and Python3. However, not all features of the IDL are yet supported by the individual binding or implementation language: #### Feature Matrix: Bindings | Binding | Status | Operating Systems | class | scalar type | struct | enumeration | string | basicarray | structarray | Callbacks | @@ -53,7 +53,7 @@ ACT supports generation of bindings or implementation stubs for C++, C, Pascal, | C | ![](Documentation/images/Tick.png) mature | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return | in,out | in,out | in | | C Dynamic | ![](Documentation/images/Tick.png) mature | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return | in,out | in,out | in | | Pascal | ![](Documentation/images/Tick.png) mature | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return | in,out | in,out | in | -| Python | ![](Documentation/images/Tick.png) complete (but unstable) | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return | in,out | in,out | in | +| Python3 | ![](Documentation/images/Tick.png) complete (but unstable) | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return | in,out | in,out | in | | Golang | ![](Documentation/images/O.png) partial support | Win, Linux, MacOS | in,return | in,out,return | ? | ? | ? | ? | ? | - | | NodeJS | ![](Documentation/images/O.png) partial support | Win, Linux, MacOS | in,return | in,out,return | ? | ? | ? | ? | ? | - | diff --git a/Source/buildbindingpython.go b/Source/buildbindingpython.go index 3de4773c..7bca6b5a 100644 --- a/Source/buildbindingpython.go +++ b/Source/buildbindingpython.go @@ -28,7 +28,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ////////////////////////////////////////////////////////////////////////////////////////////////////// // buildbindingpython.go -// functions to generate dynamic Python-bindings of a library's API in form of dynamically loaded functions +// functions to generate dynamic Python3-bindings of a library's API in form of dynamically loaded functions // handles. ////////////////////////////////////////////////////////////////////////////////////////////////////// From bcb84b2262707881942bec1bbe43bfb26ca04169 Mon Sep 17 00:00:00 2001 From: Martin Weismann Date: Mon, 7 Jan 2019 15:02:24 +0100 Subject: [PATCH 16/22] Fix python example generation --- .../Examples/Python/LibPrimes_Example.py | 2 +- Source/buildbindingpython.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Examples/Primes/LibPrimes_component/Examples/Python/LibPrimes_Example.py b/Examples/Primes/LibPrimes_component/Examples/Python/LibPrimes_Example.py index cad93b9f..41adf541 100644 --- a/Examples/Primes/LibPrimes_component/Examples/Python/LibPrimes_Example.py +++ b/Examples/Primes/LibPrimes_component/Examples/Python/LibPrimes_Example.py @@ -12,7 +12,7 @@ import os import sys -sys.path.append(os.path.join(os.path.realpath(__file__),"..", "..", "..", "Bindings", "Python")) +sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), "..", "..", "Bindings", "Python")) import LibPrimes def progressCallback(progress, shouldAbort): diff --git a/Source/buildbindingpython.go b/Source/buildbindingpython.go index 7bca6b5a..bf0a3cf7 100644 --- a/Source/buildbindingpython.go +++ b/Source/buildbindingpython.go @@ -818,8 +818,8 @@ func buildDynamiCPythonExample(componentdefinition ComponentDefinition, w Langua w.Writeln("") w.Writeln("import os") - w.Writeln("import sys") - w.Writeln("sys.path.append(os.path.join(os.path.realpath(__file__),\"..\", \"..\", \"..\", \"Bindings\", \"Python\"))") + w.Writeln("import sys") + w.Writeln("sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), \"..\", \"..\", \"Bindings\", \"Python\"))") w.Writeln("import %s",NameSpace ) w.Writeln("") w.Writeln("") @@ -840,4 +840,4 @@ func buildDynamiCPythonExample(componentdefinition ComponentDefinition, w Langua w.Writeln(" print(e)") return nil -} \ No newline at end of file +} From 309c5472cfe40efc15ca3723986375a99c32d44a Mon Sep 17 00:00:00 2001 From: Sebastian Pichlmeier Date: Tue, 8 Jan 2019 10:47:20 +0100 Subject: [PATCH 17/22] Fix pascal impl&binding with struct returns (#10) --- Source/buildbindingpascal.go | 2 +- Source/languagepascal.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/buildbindingpascal.go b/Source/buildbindingpascal.go index b931aad8..c7446806 100644 --- a/Source/buildbindingpascal.go +++ b/Source/buildbindingpascal.go @@ -895,7 +895,7 @@ func writePascalClassMethodImplementation (method ComponentDefinitionMethod, w L resultCommands = append (resultCommands, fmt.Sprintf (" Result := (Result%s <> 0);", param.ParamName)); case "struct": - callFunctionParameters = callFunctionParameters + "@A" + param.ParamName; + callFunctionParameters = callFunctionParameters + "@Result"; case "basicarray", "structarray": defineCommands = append (defineCommands, " countNeeded" + param.ParamName + ": QWord;"); diff --git a/Source/languagepascal.go b/Source/languagepascal.go index 351d290f..4571b50b 100644 --- a/Source/languagepascal.go +++ b/Source/languagepascal.go @@ -529,7 +529,7 @@ func generatePlainPascalParameter(param ComponentDefinitionParam, className stri cParams[0].ParamType = cParamTypeName; cParams[0].ParamName = "p" + param.ParamName; cParams[0].ParamComment = fmt.Sprintf("* @param[out] %s - %s", cParams[0].ParamName, param.ParamDescription); - cParams[0].ParamConvention = "out "; + cParams[0].ParamConvention = ""; cParams[0].ParamTypeNoConvention = "P" + cParamTypeName[1:]; case "basicarray": @@ -608,4 +608,4 @@ func generatePlainPascalParameter(param ComponentDefinitionParam, className stri } return cParams, nil; -} \ No newline at end of file +} From b966f52e9196075b56e328ac0b2b18ab601176a4 Mon Sep 17 00:00:00 2001 From: Sebastian Pichlmeier Date: Tue, 8 Jan 2019 11:27:25 +0100 Subject: [PATCH 18/22] Fix pascal method stub exceptions (#12) --- Source/buildimplementationpascal.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/buildimplementationpascal.go b/Source/buildimplementationpascal.go index cd19e816..d7e61d6c 100644 --- a/Source/buildimplementationpascal.go +++ b/Source/buildimplementationpascal.go @@ -1130,7 +1130,7 @@ func writePascalClassMethodDummyStub (method ComponentDefinitionMethod, w Langua } w.Writeln("begin"); - w.Writeln(" raise E%sException (%s_ERROR_NOTIMPLEMENTED);", NameSpace, strings.ToUpper (NameSpace)); + w.Writeln(" raise E%sException.Create (%s_ERROR_NOTIMPLEMENTED);", NameSpace, strings.ToUpper (NameSpace)); w.Writeln("end;"); w.Writeln(""); From 6704046c7e0065384926d971dc2ffa3bb7a55c9c Mon Sep 17 00:00:00 2001 From: Martin Weismann <30837766+martinweismann@users.noreply.github.com> Date: Tue, 8 Jan 2019 13:43:33 +0100 Subject: [PATCH 19/22] Add CODE_OF_CONDUCT (#13) --- CODE_OF_CONDUCT.md | 76 ++++++++++++++++++++++++++++++++++++++++++++++ CONTRIBUTING.md | 2 ++ 2 files changed, 78 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..b9d886d9 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at automatic-component-toolkit.contributor.agreements@autodesk.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c68894bf..bb2384eb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,6 +16,8 @@ You can also contribute by reporting bugs in the [Issue tracker](../../issues), 2. When contributing to this repository, please first discuss the change you wish to make via issue with the [maintainers](#maintainers) of this repository. This way, we can ensure that there is no overlap between contributions or internal development work. +3. Adhere to the [code of conduct](CODE_OF_CONDUCT.md). + ## Submitting a pull request When ready to contribute, fork this repository and submit a pull request that references the issue it resolves. Be sure to include a clear and detailed description of the changes you've made so that we can verify them and eventually merge. From b2c45d27e06dff0e2677fe1a2c5d5b70fdde1cc7 Mon Sep 17 00:00:00 2001 From: Martin Weismann Date: Fri, 11 Jan 2019 10:21:48 +0100 Subject: [PATCH 20/22] Add missing nested namespace in C++ implementation --- Source/buildimplementationcpp.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/buildimplementationcpp.go b/Source/buildimplementationcpp.go index 6d9ab6b0..6aa1121a 100644 --- a/Source/buildimplementationcpp.go +++ b/Source/buildimplementationcpp.go @@ -106,7 +106,7 @@ func BuildImplementationCPP(component ComponentDefinition, outputFolder string, cppWrapperfile.WriteCLicenseHeader(component, fmt.Sprintf("This is an autogenerated C++ implementation file in order to allow easy\ndevelopment of %s. The functions in this file need to be implemented. It needs to be generated only once.", LibraryName), true) - err = buildCPPInterfaceWrapper(component, cppWrapperfile, NameSpace, implementation.ClassIdentifier, BaseName, doJournal) + err = buildCPPInterfaceWrapper(component, cppWrapperfile, NameSpace, ImplementationSubNameSpace, implementation.ClassIdentifier, BaseName, doJournal) if err != nil { return err } @@ -382,7 +382,7 @@ func buildCPPGlobalStubFile(component ComponentDefinition, stubfile LanguageWrit return nil } -func buildCPPInterfaceWrapper(component ComponentDefinition, w LanguageWriter, NameSpace string, ClassIdentifier string, BaseName string, doJournal bool) error { +func buildCPPInterfaceWrapper(component ComponentDefinition, w LanguageWriter, NameSpace string, NameSpaceImplementation string, ClassIdentifier string, BaseName string, doJournal bool) error { w.Writeln("#include \"%s.h\"", BaseName) w.Writeln("#include \"%s_interfaces.hpp\"", BaseName) w.Writeln("#include \"%s_interfaceexception.hpp\"", BaseName) @@ -390,7 +390,7 @@ func buildCPPInterfaceWrapper(component ComponentDefinition, w LanguageWriter, N w.Writeln("#include \"%s_interfacejournal.hpp\"", BaseName) } w.Writeln("") - w.Writeln("using namespace %s;", NameSpace) + w.Writeln("using namespace %s::%s;", NameSpace, NameSpaceImplementation) w.Writeln("") if (doJournal) { From e70df9cf934ca6bae6e1be4a638f89e59826d714 Mon Sep 17 00:00:00 2001 From: Martin Weismann <30837766+martinweismann@users.noreply.github.com> Date: Fri, 11 Jan 2019 10:34:35 +0100 Subject: [PATCH 21/22] Update to version 1.4, prepare tutorial (#14) --- .../Bindings/Cpp/libprimes.cpp | 2 +- .../Bindings/Cpp/libprimes.h | 2 +- .../Bindings/Cpp/libprimes.hpp | 2 +- .../Bindings/Cpp/libprimes_types.h | 2 +- .../Bindings/CppDynamic/libprimes_dynamic.h | 2 +- .../Bindings/CppDynamic/libprimes_dynamic.hpp | 24 +++--- .../Bindings/CppDynamic/libprimes_types.h | 2 +- .../Bindings/Pascal/Unit_LibPrimes.pas | 4 +- .../Bindings/Python/LibPrimes.py | 2 +- .../Examples/CPP/CMakeLists.txt | 2 +- .../Examples/CPP/LibPrimes_example.cpp | 2 +- .../Examples/CppDynamic/CMakeLists.txt | 6 +- .../Examples/CppDynamic/LibPrimes_example.cpp | 9 +- .../Examples/Pascal/LibPrimes_Example.lpr | 9 +- .../Examples/Python/LibPrimes_Example.py | 10 ++- .../Implementations/Cpp/CMakeLists.txt | 8 +- .../Cpp/Interfaces/libprimes.h | 2 +- .../libprimes_interfaceexception.cpp | 2 +- .../libprimes_interfaceexception.hpp | 2 +- .../Interfaces/libprimes_interfacejournal.cpp | 2 +- .../Interfaces/libprimes_interfacejournal.hpp | 2 +- .../Cpp/Interfaces/libprimes_interfaces.hpp | 2 +- .../Interfaces/libprimes_interfacewrapper.cpp | 2 +- .../Cpp/Interfaces/libprimes_types.h | 2 +- .../Implementations/Cpp/Stub/libprimes.cpp | 8 +- .../Cpp/Stub/libprimes_calculator.cpp | 3 +- .../Cpp/Stub/libprimes_calculator.hpp | 2 +- .../libprimes_factorizationcalculator.cpp | 2 +- .../libprimes_factorizationcalculator.hpp | 5 +- .../Cpp/Stub/libprimes_sievecalculator.cpp | 2 +- .../Cpp/Stub/libprimes_sievecalculator.hpp | 4 +- .../Pascal/Interfaces/libprimes.lpr | 2 +- .../Pascal/Interfaces/libprimes_exception.pas | 2 +- .../Pascal/Interfaces/libprimes_exports.pas | 2 +- .../Interfaces/libprimes_interfaces.pas | 2 +- .../Pascal/Interfaces/libprimes_types.pas | 4 +- .../Pascal/Stub/libprimes_impl.pas | 7 +- .../Pascal/Stub/libprimes_impl_baseclass.pas | 2 +- .../Pascal/Stub/libprimes_impl_calculator.pas | 2 +- ...libprimes_impl_factorizationcalculator.pas | 2 +- .../Stub/libprimes_impl_sievecalculator.pas | 2 +- Examples/Primes/PrimeUser/main.cpp | 84 ------------------- Examples/Primes/Tutorial.md | 8 +- Source/automaticcomponenttoolkit.go | 2 +- 44 files changed, 92 insertions(+), 159 deletions(-) delete mode 100644 Examples/Primes/PrimeUser/main.cpp diff --git a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.cpp b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.cpp index 86949f4e..92cda33c 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.cpp +++ b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.cpp @@ -4,7 +4,7 @@ Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated C++ Wrapper Implementation file in order to allow an easy use of Prime Numbers Library diff --git a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.h b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.h index 08f6956b..ef110e11 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.h +++ b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.h @@ -4,7 +4,7 @@ Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated plain C Header file in order to allow an easy use of Prime Numbers Library diff --git a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.hpp b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.hpp index f8d5ab77..bebc5cc1 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.hpp +++ b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes.hpp @@ -4,7 +4,7 @@ Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated C++ Header file in order to allow an easy use of Prime Numbers Library diff --git a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes_types.h b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes_types.h index e8a5027e..2b14eea7 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes_types.h +++ b/Examples/Primes/LibPrimes_component/Bindings/Cpp/libprimes_types.h @@ -4,7 +4,7 @@ Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated plain C Header file with basic types in order to allow an easy use of Prime Numbers Library diff --git a/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.h b/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.h index d798c7e1..b665434a 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.h +++ b/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.h @@ -4,7 +4,7 @@ Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated plain C Header file in order to allow an easy use of Prime Numbers Library diff --git a/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.hpp b/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.hpp index 91b5e27c..8fde3a7f 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.hpp +++ b/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_dynamic.hpp @@ -4,7 +4,7 @@ Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated C++ Header file in order to allow an easy use of Prime Numbers Library @@ -158,11 +158,11 @@ class CLibPrimesWrapper { } - void ReleaseInstance (CLibPrimesBaseClass * pInstance); - void GetLibraryVersion (LibPrimes_uint32 & nMajor, LibPrimes_uint32 & nMinor, LibPrimes_uint32 & nMicro); - PLibPrimesFactorizationCalculator CreateFactorizationCalculator (); - PLibPrimesSieveCalculator CreateSieveCalculator (); - void SetJournal (const std::string & sFileName); + inline void ReleaseInstance (CLibPrimesBaseClass * pInstance); + inline void GetLibraryVersion (LibPrimes_uint32 & nMajor, LibPrimes_uint32 & nMinor, LibPrimes_uint32 & nMicro); + inline PLibPrimesFactorizationCalculator CreateFactorizationCalculator (); + inline PLibPrimesSieveCalculator CreateSieveCalculator (); + inline void SetJournal (const std::string & sFileName); private: sLibPrimesDynamicWrapperTable m_WrapperTable; @@ -247,10 +247,10 @@ class CLibPrimesCalculator : public CLibPrimesBaseClass { { } - LibPrimes_uint64 GetValue (); - void SetValue (const LibPrimes_uint64 nValue); - void Calculate (); - void SetProgressCallback (const LibPrimesProgressCallback pProgressCallback); + inline LibPrimes_uint64 GetValue (); + inline void SetValue (const LibPrimes_uint64 nValue); + inline void Calculate (); + inline void SetProgressCallback (const LibPrimesProgressCallback pProgressCallback); }; /************************************************************************************************************************* @@ -267,7 +267,7 @@ class CLibPrimesFactorizationCalculator : public CLibPrimesCalculator { { } - void GetPrimeFactors (std::vector & PrimeFactorsBuffer); + inline void GetPrimeFactors (std::vector & PrimeFactorsBuffer); }; /************************************************************************************************************************* @@ -284,7 +284,7 @@ class CLibPrimesSieveCalculator : public CLibPrimesCalculator { { } - void GetPrimes (std::vector & PrimesBuffer); + inline void GetPrimes (std::vector & PrimesBuffer); }; /** diff --git a/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_types.h b/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_types.h index e8a5027e..2b14eea7 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_types.h +++ b/Examples/Primes/LibPrimes_component/Bindings/CppDynamic/libprimes_types.h @@ -4,7 +4,7 @@ Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated plain C Header file with basic types in order to allow an easy use of Prime Numbers Library diff --git a/Examples/Primes/LibPrimes_component/Bindings/Pascal/Unit_LibPrimes.pas b/Examples/Primes/LibPrimes_component/Bindings/Pascal/Unit_LibPrimes.pas index ae2aa977..ab507961 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/Pascal/Unit_LibPrimes.pas +++ b/Examples/Primes/LibPrimes_component/Bindings/Pascal/Unit_LibPrimes.pas @@ -5,7 +5,7 @@ All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated Pascal Header file in order to allow an easy use of Prime Numbers Library @@ -91,7 +91,7 @@ interface type - PLibPrimes_ProgressCallback = function(const fProgressPercentage: Single; out pShouldAbort: Cardinal): Integer; cdecl; + PLibPrimes_ProgressCallback = function(const fProgressPercentage: Single; out pShouldAbort: Byte): Integer; cdecl; (************************************************************************************************************************* Declaration of handle classes diff --git a/Examples/Primes/LibPrimes_component/Bindings/Python/LibPrimes.py b/Examples/Primes/LibPrimes_component/Bindings/Python/LibPrimes.py index 41a56a1d..32645f3c 100644 --- a/Examples/Primes/LibPrimes_component/Bindings/Python/LibPrimes.py +++ b/Examples/Primes/LibPrimes_component/Bindings/Python/LibPrimes.py @@ -4,7 +4,7 @@ All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated Python file in order to allow an easy use of Prime Numbers Library diff --git a/Examples/Primes/LibPrimes_component/Examples/CPP/CMakeLists.txt b/Examples/Primes/LibPrimes_component/Examples/CPP/CMakeLists.txt index 50f1d761..d33b1633 100644 --- a/Examples/Primes/LibPrimes_component/Examples/CPP/CMakeLists.txt +++ b/Examples/Primes/LibPrimes_component/Examples/CPP/CMakeLists.txt @@ -4,7 +4,7 @@ Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated CMake Project that demonstrates the usage of the C++ bindings of Prime Numbers Library diff --git a/Examples/Primes/LibPrimes_component/Examples/CPP/LibPrimes_example.cpp b/Examples/Primes/LibPrimes_component/Examples/CPP/LibPrimes_example.cpp index 892caa8f..61a09128 100644 --- a/Examples/Primes/LibPrimes_component/Examples/CPP/LibPrimes_example.cpp +++ b/Examples/Primes/LibPrimes_component/Examples/CPP/LibPrimes_example.cpp @@ -4,7 +4,7 @@ Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated C++ application that demonstrates the usage of the C++ bindings of Prime Numbers Library diff --git a/Examples/Primes/LibPrimes_component/Examples/CppDynamic/CMakeLists.txt b/Examples/Primes/LibPrimes_component/Examples/CppDynamic/CMakeLists.txt index 90a32d5c..b7d34e0c 100644 --- a/Examples/Primes/LibPrimes_component/Examples/CppDynamic/CMakeLists.txt +++ b/Examples/Primes/LibPrimes_component/Examples/CppDynamic/CMakeLists.txt @@ -1,13 +1,13 @@ #[[++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.2.6. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated CMake Project that demonstrates the - usage of the Dynamic C++ bindings of Prime Numbers Interface + usage of the Dynamic C++ bindings of Prime Numbers Library Interface version: 1.2.0 diff --git a/Examples/Primes/LibPrimes_component/Examples/CppDynamic/LibPrimes_example.cpp b/Examples/Primes/LibPrimes_component/Examples/CppDynamic/LibPrimes_example.cpp index 70381478..bcee6558 100644 --- a/Examples/Primes/LibPrimes_component/Examples/CppDynamic/LibPrimes_example.cpp +++ b/Examples/Primes/LibPrimes_component/Examples/CppDynamic/LibPrimes_example.cpp @@ -1,12 +1,15 @@ /*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. + Abstract: This is an autogenerated C++ application that demonstrates the - usage of the Dynamic C++ bindings of Prime Numbers Interface -Interface version: 1.0.0 + usage of the Dynamic C++ bindings of Prime Numbers Library + +Interface version: 1.2.0 */ diff --git a/Examples/Primes/LibPrimes_component/Examples/Pascal/LibPrimes_Example.lpr b/Examples/Primes/LibPrimes_component/Examples/Pascal/LibPrimes_Example.lpr index 0336c281..a8db4d17 100644 --- a/Examples/Primes/LibPrimes_component/Examples/Pascal/LibPrimes_Example.lpr +++ b/Examples/Primes/LibPrimes_component/Examples/Pascal/LibPrimes_Example.lpr @@ -1,12 +1,15 @@ (*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. + Abstract: This is an autogenerated Pascal application that demonstrates the - usage of the Pascal bindings of Prime Numbers Interface -Interface version: 1.0.0 + usage of the Pascal bindings of Prime Numbers Library + +Interface version: 1.2.0 *) diff --git a/Examples/Primes/LibPrimes_component/Examples/Python/LibPrimes_Example.py b/Examples/Primes/LibPrimes_component/Examples/Python/LibPrimes_Example.py index 41adf541..897f8c4b 100644 --- a/Examples/Primes/LibPrimes_component/Examples/Python/LibPrimes_Example.py +++ b/Examples/Primes/LibPrimes_component/Examples/Python/LibPrimes_Example.py @@ -1,15 +1,19 @@ '''++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. + Abstract: This is an autogenerated Python application that demonstrates the - usage of the Python bindings of Prime Numbers Interface -Interface version: 1.0.0 + usage of the Python bindings of Prime Numbers Library + +Interface version: 1.2.0 ''' + import os import sys sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), "..", "..", "Bindings", "Python")) diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/CMakeLists.txt b/Examples/Primes/LibPrimes_component/Implementations/Cpp/CMakeLists.txt index a938d89d..ccf3ea4d 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/CMakeLists.txt +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/CMakeLists.txt @@ -1,12 +1,12 @@ #[[++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. -Abstract: This is an autogenerated CMakeLists file for the development of Prime Numbers Interface. +Abstract: This is an autogenerated CMakeLists file for the development of Prime Numbers Library. Interface version: 1.2.0 @@ -15,7 +15,7 @@ Interface version: 1.2.0 cmake_minimum_required(VERSION 3.5) -### The implementation of the Prime Numbers Interface component +### The implementation of the Prime Numbers Library component project(LibPrimes) set (CMAKE_CXX_STANDARD 11) diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes.h b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes.h index 08f6956b..ef110e11 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes.h +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes.h @@ -4,7 +4,7 @@ Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated plain C Header file in order to allow an easy use of Prime Numbers Library diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.cpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.cpp index 7c91e0cc..440b7040 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.cpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.cpp @@ -4,7 +4,7 @@ Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated C++ Implementation file with the basic internal exception type in order to allow an easy use of Prime Numbers Library diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.hpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.hpp index e90a1880..8ea42a10 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.hpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaceexception.hpp @@ -4,7 +4,7 @@ Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated C++ Header file with the basic internal exception type in order to allow an easy use of Prime Numbers Library diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacejournal.cpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacejournal.cpp index 88ad8191..d89395c5 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacejournal.cpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacejournal.cpp @@ -4,7 +4,7 @@ Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated C++ implementation file in order to allow easy development of Prime Numbers Library. It provides an automatic Journaling mechanism for the library implementation. diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacejournal.hpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacejournal.hpp index be4d16f2..65d8e2f0 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacejournal.hpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacejournal.hpp @@ -4,7 +4,7 @@ Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated C++ header file in order to allow easy development of Prime Numbers Library. It provides an automatic Journaling mechanism for the library implementation. diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaces.hpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaces.hpp index c45b8678..71b5002f 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaces.hpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfaces.hpp @@ -4,7 +4,7 @@ Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated C++ header file in order to allow easy development of Prime Numbers Library. The implementer of Prime Numbers Library needs to diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacewrapper.cpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacewrapper.cpp index 4ae7885c..884063fd 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacewrapper.cpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_interfacewrapper.cpp @@ -4,7 +4,7 @@ Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated C++ implementation file in order to allow easy development of Prime Numbers Library. The functions in this file need to be implemented. It needs to be generated only once. diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_types.h b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_types.h index e8a5027e..2b14eea7 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_types.h +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Interfaces/libprimes_types.h @@ -4,7 +4,7 @@ Copyright (C) 2018 PrimeDevelopers All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated plain C Header file with basic types in order to allow an easy use of Prime Numbers Library diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes.cpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes.cpp index dd4d3ac8..5d0b0757 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes.cpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes.cpp @@ -1,11 +1,15 @@ /*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. + Abstract: This is an autogenerated C++ implementation file in order to allow easy -development of Prime Numbers Interface. It needs to be generated only once. +development of Prime Numbers Library. It needs to be generated only once. + +Interface version: 1.2.0 */ diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.cpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.cpp index b2bebf49..94b6d391 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.cpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.cpp @@ -1,6 +1,6 @@ /*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. @@ -42,4 +42,3 @@ void CLibPrimesCalculator::SetProgressCallback (const LibPrimesProgressCallback m_Callback = pProgressCallback; } - diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.hpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.hpp index 7942d503..121b1789 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.hpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_calculator.hpp @@ -1,6 +1,6 @@ /*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.cpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.cpp index 913e1e81..6f9d1a49 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.cpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.cpp @@ -1,6 +1,6 @@ /*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.hpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.hpp index 93c75a7f..c1f61b12 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.hpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_factorizationcalculator.hpp @@ -1,6 +1,6 @@ /*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. @@ -53,7 +53,8 @@ class CLibPrimesFactorizationCalculator : public virtual ILibPrimesFactorization * Public member functions to implement. */ - void GetPrimeFactors(LibPrimes_uint64 nPrimeFactorsBufferSize, LibPrimes_uint64 * pPrimeFactorsNeededCount, sLibPrimesPrimeFactor * pPrimeFactorsBuffer); + void GetPrimeFactors(LibPrimes_uint64 nPrimeFactorsBufferSize, LibPrimes_uint64* pPrimeFactorsNeededCount, sLibPrimesPrimeFactor* pPrimeFactorsBuffer); + }; } // namespace Impl diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_sievecalculator.cpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_sievecalculator.cpp index 8faa88d5..6f17111c 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_sievecalculator.cpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_sievecalculator.cpp @@ -1,6 +1,6 @@ /*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. diff --git a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_sievecalculator.hpp b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_sievecalculator.hpp index 280ba983..c75920e4 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_sievecalculator.hpp +++ b/Examples/Primes/LibPrimes_component/Implementations/Cpp/Stub/libprimes_sievecalculator.hpp @@ -1,6 +1,6 @@ /*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. @@ -49,7 +49,7 @@ class CLibPrimesSieveCalculator : public virtual ILibPrimesSieveCalculator, publ * Public member functions to implement. */ - void GetPrimes (LibPrimes_uint64 nPrimesBufferSize, LibPrimes_uint64 * pPrimesNeededCount, LibPrimes_uint64 * pPrimesBuffer); + void GetPrimes (LibPrimes_uint64 nPrimesBufferSize, LibPrimes_uint64* pPrimesNeededCount, LibPrimes_uint64 * pPrimesBuffer); }; diff --git a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes.lpr b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes.lpr index 1af0d311..41b81dd2 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes.lpr +++ b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes.lpr @@ -4,7 +4,7 @@ All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.3. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated Pascal project file in order to allow easy development of Prime Numbers Library. diff --git a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_exception.pas b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_exception.pas index 5bf79d6e..0195a43e 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_exception.pas +++ b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_exception.pas @@ -4,7 +4,7 @@ All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated Pascal exception class definition file in order to allow easy development of Prime Numbers Library. The functions in this file need to be implemented. It needs to be generated only once. diff --git a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_exports.pas b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_exports.pas index 438e35d7..8fbb0a30 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_exports.pas +++ b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_exports.pas @@ -4,7 +4,7 @@ All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated Pascal export implementation file in order to allow easy development of Prime Numbers Library. The functions in this file need to be implemented. It needs to be generated only once. diff --git a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_interfaces.pas b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_interfaces.pas index 0e35060c..09728ad5 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_interfaces.pas +++ b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_interfaces.pas @@ -4,7 +4,7 @@ All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated Pascal interface definition file in order to allow easy development of Prime Numbers Library. The functions in this file need to be implemented. It needs to be generated only once. diff --git a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_types.pas b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_types.pas index a5ee039b..f9829351 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_types.pas +++ b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Interfaces/libprimes_types.pas @@ -4,7 +4,7 @@ All rights reserved. -This file has been generated by the Automatic Component Toolkit (ACT) version 1.3.2. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. Abstract: This is an autogenerated Pascal type definition file in order to allow easy development of Prime Numbers Library. The functions in this file need to be implemented. It needs to be generated only once. @@ -85,7 +85,7 @@ interface type - PLibPrimes_ProgressCallback = function(const fProgressPercentage: Single; out pShouldAbort: Cardinal): Integer; cdecl; + PLibPrimes_ProgressCallback = function(const fProgressPercentage: Single; out pShouldAbort: Byte): Integer; cdecl; implementation diff --git a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl.pas b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl.pas index e1786742..5a929efa 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl.pas +++ b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl.pas @@ -1,11 +1,14 @@ (*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. +This file has been generated by the Automatic Component Toolkit (ACT) version 1.4.0. + Abstract: This is an autogenerated Pascal implementation file in order to allow easy -development of Prime Numbers Interface. It needs to be generated only once. +development of Prime Numbers Library. It needs to be generated only once. + Interface version: 1.2.0 *) diff --git a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl_baseclass.pas b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl_baseclass.pas index b7743a6e..e7733694 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl_baseclass.pas +++ b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl_baseclass.pas @@ -1,6 +1,6 @@ (*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. diff --git a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl_calculator.pas b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl_calculator.pas index 2852c346..9264f107 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl_calculator.pas +++ b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl_calculator.pas @@ -1,6 +1,6 @@ (*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. diff --git a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl_factorizationcalculator.pas b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl_factorizationcalculator.pas index 519e04bf..d84acbac 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl_factorizationcalculator.pas +++ b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl_factorizationcalculator.pas @@ -1,6 +1,6 @@ (*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. diff --git a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl_sievecalculator.pas b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl_sievecalculator.pas index 2d647597..24e480fa 100644 --- a/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl_sievecalculator.pas +++ b/Examples/Primes/LibPrimes_component/Implementations/Pascal/Stub/libprimes_impl_sievecalculator.pas @@ -1,6 +1,6 @@ (*++ -Copyright (C) 2018 Automatic Component Toolkit Developers +Copyright (C) 2018 PrimeDevelopers All rights reserved. diff --git a/Examples/Primes/PrimeUser/main.cpp b/Examples/Primes/PrimeUser/main.cpp deleted file mode 100644 index 1d478f1a..00000000 --- a/Examples/Primes/PrimeUser/main.cpp +++ /dev/null @@ -1,84 +0,0 @@ -#include "libprimes_dynamic.hpp" -#include - - -void progressCallback(float progress, bool *shouldAbort) -{ - std::cout << "Progress = " << round(progress * 100) << std::endl; - if (shouldAbort) { - *shouldAbort = false; - } -} - -void progressCallbackCancel(float progress, bool *shouldAbort) -{ - std::cout << "Progress = " << round(progress * 100) << std::endl; - if (shouldAbort) { - *shouldAbort = progress > 0.5f; - } -} - - -void calculatePrimes(LibPrimes::CLibPrimesWrapper& wrapper, const unsigned long long number) { - auto sieve = wrapper.CreateSieveCalculator(); - - sieve->SetValue(number); - - std::cout << "Calculate using a cancelling callback" << std::endl; - try { - sieve->SetProgressCallback(progressCallbackCancel); - sieve->Calculate(); - } - catch (LibPrimes::ELibPrimesException &e) { - if (e.getErrorCode() == LIBPRIMES_ERROR_CALCULATIONABORTED) { - std::cout << "Calculation aborted" << std::endl; - } - else - throw e; - } - - std::cout << "Calculate using a noncancelling callback" << std::endl; - sieve->SetProgressCallback(progressCallback); - sieve->Calculate(); - - std::vector primes(0); - sieve->GetPrimes(primes); - - std::cout << "Primes <= " << number << ":" << std::endl; - for (size_t i = 0; i < primes.size(); i++) { - std::cout << primes[i] << " "; - } - std::cout << std::endl; -} - -void factorize(LibPrimes::CLibPrimesWrapper& wrapper, const unsigned long long number) { - auto factorisation = wrapper.CreateFactorizationCalculator(); - - factorisation->SetValue(number); - factorisation->Calculate(); - - std::vector primeFactors(0); - factorisation->GetPrimeFactors(primeFactors); - - std::cout << factorisation->GetValue() << " = "; - for (size_t i = 0; i < primeFactors.size(); i++) { - auto pF = primeFactors[i]; - std::cout << pF.m_Prime << "^" << pF.m_Multiplicity << ((i < (primeFactors.size() - 1)) ? " * " : ""); - } - std::cout << std::endl; -} - -int main() -{ - try { - auto wrapper = LibPrimes::CLibPrimesWrapper::loadLibrary("LibPrimes.dll"); - factorize(*wrapper.get(), 3 * 3 * 17 * 17); - calculatePrimes(*wrapper.get(), 100); - } - catch (std::exception &e) { - std::cout << e.what() << std::endl; - return -1; - } - - return 0; -} \ No newline at end of file diff --git a/Examples/Primes/Tutorial.md b/Examples/Primes/Tutorial.md index d6e64a64..d141b217 100644 --- a/Examples/Primes/Tutorial.md +++ b/Examples/Primes/Tutorial.md @@ -37,15 +37,15 @@ _There are much more efficient algorithms and more suitable software packages to # 2. Requirements - CMake - - A C++ compiler / development environment. This tutorial was tested with Visual Studio 2017, but should also work with GCC and make - - ACT: This tutorial is tested to work with release 1.3.2 of ACT. You can get it from [the release page](https://github.com/Autodesk/AutomaticComponentToolkit/releases). -Decide on a location for your tutorial's component to live in, and download the binary for your platform into this folder. + - A C++ compiler / development environment. This tutorial was tested with Visual Studio 2017, but should also work with `GCC` and `make` or other development tools. + - ACT: This tutorial is tested to work with release 1.4.0 of ACT. You can get it from [the releases page](https://github.com/Autodesk/AutomaticComponentToolkit/releases). +Decide on a location for your tutorial's component to live in, and download the binary for your platform into this folder. Alternatively, stick it somwhere in your `$PATH`. # 3. The Library's Implementation ## 3.1. The definition of the component An ACT component's interface is fully described by its IDL file. -This section sets up a IDL-file for LibPrimes. +This section sets up an IDL-file for LibPrimes. First, copy the snippet, a bare-bone IDL-file, and save it into libPrimes.xml in your component's folder. ```xml diff --git a/Source/automaticcomponenttoolkit.go b/Source/automaticcomponenttoolkit.go index eefc3aab..71d522ec 100644 --- a/Source/automaticcomponenttoolkit.go +++ b/Source/automaticcomponenttoolkit.go @@ -69,7 +69,7 @@ func readComponentDefinition(FileName string, ACTVersion string) (ComponentDefin } func main () { - ACTVersion := "1.3.3" + ACTVersion := "1.4.0" fmt.Fprintln(os.Stdout, "Automatic Component Toolkit v" + ACTVersion) if (len (os.Args) < 2) { log.Fatal ("Please run with the Interface Description XML as command line parameter."); From 1cddb1292145458adee290be92947a6f79ff47d1 Mon Sep 17 00:00:00 2001 From: Martin Weismann Date: Fri, 11 Jan 2019 10:37:07 +0100 Subject: [PATCH 22/22] Fix typo --- Source/automaticcomponenttoolkit.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/automaticcomponenttoolkit.go b/Source/automaticcomponenttoolkit.go index 71d522ec..db2e394e 100644 --- a/Source/automaticcomponenttoolkit.go +++ b/Source/automaticcomponenttoolkit.go @@ -74,7 +74,7 @@ func main () { if (len (os.Args) < 2) { log.Fatal ("Please run with the Interface Description XML as command line parameter."); log.Fatal ("To specify a path for the generated source code use the optional flag \"-o ABSOLUTE_PATH_TO_OUTPUT_FOLDER\""); - log.Fatal ("To create a diff between two versions of an Interface Description XML use the optional flagg \"-d OTHER_IDL_FILE\""); + log.Fatal ("To create a diff between two versions of an Interface Description XML use the optional flag \"-d OTHER_IDL_FILE\""); } if os.Args[1] == "-v" { fmt.Fprintln(os.Stdout, "Version: "+ACTVersion)