Skip to content

Commit 5211de2

Browse files
committed
Add some C interface unit tests.
Also fixed up a few small issues found
1 parent cd21775 commit 5211de2

File tree

5 files changed

+427
-5
lines changed

5 files changed

+427
-5
lines changed

CMakeLists.txt

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@ option( SpecUtils_ENABLE_EQUALITY_CHECKS "Enables the equal_enough(...) function
2828
option( PERFORM_DEVELOPER_CHECKS "Performs additional computationally expensive tests during execution (requires linking to boost)" OFF )
2929

3030

31+
if( SpecUtils_PYTHON_BINDINGS )
32+
option( SpecUtils_SHARED_LIB "Whether to compile a shared, or static library" ON )
33+
list( APPEND sources bindings/python/SpecFile_py.cpp )
34+
else()
35+
#default to building a static lib
36+
option( SpecUtils_SHARED_LIB "Whether to compile a shared, or static library" OFF )
37+
endif()
38+
3139

3240
set( SpecUtils_FLT_PARSE_METHOD "default_value" CACHE STRING [[How to parse lists of numbers.
3341
Choose one of: FastFloat, FromChars, boost, strtod.
@@ -247,16 +255,11 @@ if( SpecUtils_ENABLE_URI_SPECTRA )
247255
find_package( ZLIB REQUIRED )
248256
endif( SpecUtils_ENABLE_URI_SPECTRA )
249257

250-
#default to building a static lib
251-
set( SpecUtils_LIB_TYPE STATIC )
252-
253258
if( SpecUtils_PYTHON_BINDINGS )
254-
set( SpecUtils_LIB_TYPE SHARED )
255259
list( APPEND sources bindings/python/SpecFile_py.cpp )
256260
endif( SpecUtils_PYTHON_BINDINGS )
257261

258262
if( SpecUtils_JAVA_SWIG )
259-
set( SpecUtils_LIB_TYPE SHARED )
260263
list( APPEND sources bindings/swig/SpecUtils.i )
261264
endif( SpecUtils_JAVA_SWIG )
262265

@@ -265,6 +268,12 @@ if( SpecUtils_C_BINDINGS )
265268
list( APPEND sources bindings/c/SpecUtils_c.cpp )
266269
endif( SpecUtils_C_BINDINGS )
267270

271+
if( SpecUtils_SHARED_LIB )
272+
set( SpecUtils_LIB_TYPE SHARED )
273+
else( SpecUtils_SHARED_LIB )
274+
set( SpecUtils_LIB_TYPE STATIC )
275+
endif( SpecUtils_SHARED_LIB )
276+
268277
add_library( SpecUtils ${SpecUtils_LIB_TYPE} ${sources} ${headers} ${OTHER_SUPPORT_FILES} )
269278
set_target_properties( SpecUtils PROPERTIES PREFIX "lib" OUTPUT_NAME "SpecUtils" )
270279

bindings/c/SpecUtils_c.cpp

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1511,6 +1511,30 @@ void SpecUtils_Measurement_reset( SpecUtils_Measurement *instance )
15111511
}
15121512

15131513

1514+
const char *SpecUtils_Measurement_description( const SpecUtils_Measurement * const instance )
1515+
{
1516+
auto m = reinterpret_cast<const SpecUtils::Measurement *>( instance );
1517+
assert( m );
1518+
if( !m )
1519+
return "";
1520+
1521+
const vector<string> &remarks = m->remarks();
1522+
1523+
for( size_t i = 0; i < remarks.size(); ++i )
1524+
{
1525+
if( SpecUtils::istarts_with(remarks[i], "Description:") )
1526+
{
1527+
const char *answer = remarks[i].c_str() + 12;
1528+
while( *answer && ((*answer) == ' ') )
1529+
++answer;
1530+
return answer;
1531+
}
1532+
}//
1533+
1534+
return "";
1535+
}
1536+
1537+
15141538
void SpecUtils_Measurement_set_description( SpecUtils_Measurement *instance,
15151539
const char * const description_cstr )
15161540
{
@@ -1547,6 +1571,30 @@ void SpecUtils_Measurement_set_description( SpecUtils_Measurement *instance,
15471571
}
15481572

15491573

1574+
const char *SpecUtils_Measurement_source_string( const SpecUtils_Measurement * const instance )
1575+
{
1576+
auto m = reinterpret_cast<const SpecUtils::Measurement *>( instance );
1577+
assert( m );
1578+
if( !m )
1579+
return "";
1580+
1581+
const vector<string> &remarks = m->remarks();
1582+
1583+
for( size_t i = 0; i < remarks.size(); ++i )
1584+
{
1585+
if( SpecUtils::istarts_with(remarks[i], "Source:") )
1586+
{
1587+
const char *answer = remarks[i].c_str() + 7;
1588+
while( *answer && ((*answer) == ' ') )
1589+
++answer;
1590+
return answer;
1591+
}
1592+
}//
1593+
1594+
return "";
1595+
}
1596+
1597+
15501598
void SpecUtils_Measurement_set_source_string( SpecUtils_Measurement *instance,
15511599
const char * const source_string_cstr )
15521600
{
@@ -1602,6 +1650,23 @@ void SpecUtils_Measurement_set_gamma_counts( SpecUtils_Measurement *instance,
16021650
}
16031651

16041652

1653+
void SpecUtils_Measurement_set_neutron_counts( SpecUtils_Measurement *instance,
1654+
const float * const counts,
1655+
const uint32_t num_tubes,
1656+
const float neutron_live_time )
1657+
{
1658+
auto m = reinterpret_cast<SpecUtils::Measurement *>( instance );
1659+
assert( m );
1660+
assert( counts || (num_tubes == 0) ); //If `counts` is null, then `num_tubes` better be zero to.
1661+
1662+
if( !m )
1663+
return;
1664+
1665+
const vector<float> nc = counts ? vector<float>(counts, counts + num_tubes) : vector<float>{};
1666+
m->set_neutron_counts( nc, neutron_live_time );
1667+
}//SpecUtils_Measurement_set_neutron_counts(...)
1668+
1669+
16051670
const char *SpecUtils_Measurement_title( const SpecUtils_Measurement * const instance )
16061671
{
16071672
auto m = reinterpret_cast<const SpecUtils::Measurement *>( instance );
@@ -1667,6 +1732,8 @@ bool SpecUtils_Measurement_set_start_time_str( SpecUtils_Measurement *instance,
16671732

16681733
if( m )
16691734
m->set_start_time( tp );
1735+
1736+
return m && !SpecUtils::is_special(tp);
16701737
}
16711738

16721739
char SpecUtils_Measurement_pcf_tag( const SpecUtils_Measurement * const instance )

bindings/c/SpecUtils_c.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -721,11 +721,19 @@ SpecUtils_Measurement_set_equal( SpecUtils_Measurement *lhs, const SpecUtils_Mea
721721
DLLEXPORT void CALLINGCONVENTION
722722
SpecUtils_Measurement_reset( SpecUtils_Measurement *instance );
723723

724+
/** Returns the measurement description. Zero terminated, and non-null. */
725+
DLLEXPORT const char * CALLINGCONVENTION
726+
SpecUtils_Measurement_description( const SpecUtils_Measurement * const instance );
724727

728+
725729
DLLEXPORT void CALLINGCONVENTION
726730
SpecUtils_Measurement_set_description( SpecUtils_Measurement *instance,
727731
const char * const description );
728732

733+
/** Returns the measurement description. Zero terminated, and non-null. */
734+
DLLEXPORT const char * CALLINGCONVENTION
735+
SpecUtils_Measurement_source_string( const SpecUtils_Measurement * const instance );
736+
729737
/** This is a GADRAS specific function - it actually adds a remark to Measurement that starts with "Source:" */
730738
DLLEXPORT void CALLINGCONVENTION
731739
SpecUtils_Measurement_set_source_string( SpecUtils_Measurement *instance,
@@ -737,6 +745,21 @@ SpecUtils_Measurement_set_gamma_counts( SpecUtils_Measurement *instance,
737745
const uint32_t nchannels,
738746
const float live_time,
739747
const float real_time );
748+
749+
/** Sets the neutron counts.
750+
751+
@param instance The `SpecUtils_Measurement` to to modify.
752+
@param counts The array of counts from each neutron detector. Most detectors will probably have one entry
753+
but for example, if you have multiple He3 tubes, you may have multiple entries.
754+
@param num_tubes The number of entries in `counts`.
755+
@param neutron_live_time The live time of the neutron measurement. If it is the same as the gamma detector
756+
in this measurement, you can provide a negative value, and the gamma real-time will be used.
757+
*/
758+
DLLEXPORT void CALLINGCONVENTION
759+
SpecUtils_Measurement_set_neutron_counts( SpecUtils_Measurement *instance,
760+
const float * const counts,
761+
const uint32_t num_tubes,
762+
const float neutron_live_time );
740763

741764
DLLEXPORT const char * CALLINGCONVENTION
742765
SpecUtils_Measurement_title( const SpecUtils_Measurement * const instance );

unit_tests/CMakeLists.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,16 @@ if( SpecUtils_ENABLE_URI_SPECTRA )
207207
)
208208
endif()
209209

210+
if( SpecUtils_C_BINDINGS )
211+
add_executable( test_c_interface test_c_interface.cpp )
212+
target_link_libraries( test_c_interface PRIVATE SpecUtils )
213+
set_target_properties( test_c_interface PROPERTIES CXX_STANDARD 14 CXX_STANDARD_REQUIRED YES CXX_EXTENSIONS NO )
214+
add_test(
215+
NAME test_c_interface
216+
COMMAND $<TARGET_FILE:test_c_interface> ${COMMON_TEST_ARGS} -- ${DATA_DIR_ARGS}
217+
)
218+
endif( SpecUtils_C_BINDINGS )
219+
210220
if( PERFORM_DEVELOPER_CHECKS AND (Boost_VERSION VERSION_GREATER_EQUAL "1.81.0") )
211221
add_executable( test_hash test_hash.cpp )
212222
target_link_libraries( test_hash PRIVATE SpecUtils Boost::system )

0 commit comments

Comments
 (0)