Copy disabled (too large)
Download .txt
Showing preview only (15,087K chars total). Download the full file to get everything.
Repository: fledge-iot/fledge
Branch: develop
Commit: 4e34f009d742
Files: 2685
Total size: 13.7 MB
Directory structure:
gitextract_gasud238/
├── .cursor/
│ ├── rules/
│ │ ├── C/
│ │ │ ├── core.mdc
│ │ │ └── plugins/
│ │ │ ├── filter.mdc
│ │ │ ├── north.mdc
│ │ │ └── south.mdc
│ │ ├── README.md
│ │ ├── docs.mdc
│ │ ├── python/
│ │ │ ├── api.mdc
│ │ │ ├── config.mdc
│ │ │ ├── core.mdc
│ │ │ └── quality.mdc
│ │ └── tests/
│ │ └── python/
│ │ ├── api.mdc
│ │ └── unit.mdc
│ └── services/
│ ├── notification.mdc
│ └── notification_code_review.mdc
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ ├── doc_issue.yml
│ │ └── feature_request.yml
│ └── workflows/
│ └── checker.yml
├── .gitignore
├── .readthedocs.yaml
├── ADOPTERS.MD
├── C/
│ ├── common/
│ │ ├── CMakeLists.txt
│ │ ├── JSONPath.cpp
│ │ ├── acl.cpp
│ │ ├── aggregate.cpp
│ │ ├── asset_tracking.cpp
│ │ ├── audit_logger.cpp
│ │ ├── base64databuffer.cpp
│ │ ├── base64image.cpp
│ │ ├── bearer_token.cpp
│ │ ├── config_category.cpp
│ │ ├── cryptography_utils.cpp
│ │ ├── databuffer.cpp
│ │ ├── datapoint.cpp
│ │ ├── datapoint_utility.cpp
│ │ ├── file_utils.cpp
│ │ ├── filter_pipeline.cpp
│ │ ├── filter_plugin.cpp
│ │ ├── form_data.cpp
│ │ ├── image.cpp
│ │ ├── include/
│ │ │ ├── JSONPath.h
│ │ │ ├── acl.h
│ │ │ ├── aggregate.h
│ │ │ ├── asset_tracking.h
│ │ │ ├── audit_logger.h
│ │ │ ├── base64.h
│ │ │ ├── base64databuffer.h
│ │ │ ├── base64dpimage.h
│ │ │ ├── bearer_token.h
│ │ │ ├── config_category.h
│ │ │ ├── cryptography_utils.h
│ │ │ ├── databuffer.h
│ │ │ ├── datapoint.h
│ │ │ ├── datapoint_utility.h
│ │ │ ├── dpimage.h
│ │ │ ├── expression.h
│ │ │ ├── exprtk.hpp
│ │ │ ├── file_utils.h
│ │ │ ├── filter_pipeline.h
│ │ │ ├── filter_plugin.h
│ │ │ ├── form_data.h
│ │ │ ├── insert.h
│ │ │ ├── join.h
│ │ │ ├── json_properties.h
│ │ │ ├── json_provider.h
│ │ │ ├── json_utils.h
│ │ │ ├── logger.h
│ │ │ ├── management_client.h
│ │ │ ├── pipeline_debugger.h
│ │ │ ├── pipeline_element.h
│ │ │ ├── plugin_data.h
│ │ │ ├── process.h
│ │ │ ├── purge_result.h
│ │ │ ├── pyruntime.h
│ │ │ ├── pythonconfigcategory.h
│ │ │ ├── pythonreading.h
│ │ │ ├── pythonreadingset.h
│ │ │ ├── query.h
│ │ │ ├── reading.h
│ │ │ ├── reading_circularbuffer.h
│ │ │ ├── reading_set.h
│ │ │ ├── reading_stream.h
│ │ │ ├── readingset_circularbuffer.h
│ │ │ ├── resultset.h
│ │ │ ├── returns.h
│ │ │ ├── service_record.h
│ │ │ ├── sort.h
│ │ │ ├── storage_client.h
│ │ │ ├── string_utils.h
│ │ │ ├── timebucket.h
│ │ │ ├── update_modifier.h
│ │ │ ├── utils.h
│ │ │ ├── value.h
│ │ │ └── where.h
│ │ ├── join.cpp
│ │ ├── json_utils.cpp
│ │ ├── logger.cpp
│ │ ├── management_client.cpp
│ │ ├── pipeline_branch.cpp
│ │ ├── pipeline_debugger.cpp
│ │ ├── pipeline_element.cpp
│ │ ├── pipeline_filter.cpp
│ │ ├── pipeline_writer.cpp
│ │ ├── plugin_data.cpp
│ │ ├── process.cpp
│ │ ├── purge_result.cpp
│ │ ├── pyexception.cpp
│ │ ├── pyruntime.cpp
│ │ ├── pythonconfigcategory.cpp
│ │ ├── pythonreading.cpp
│ │ ├── pythonreadingset.cpp
│ │ ├── query.cpp
│ │ ├── reading.cpp
│ │ ├── reading_circularbuffer.cpp
│ │ ├── reading_set.cpp
│ │ ├── readingset_circularbuffer.cpp
│ │ ├── result_set.cpp
│ │ ├── service_record.cpp
│ │ ├── storage_client.cpp
│ │ ├── string_utils.cpp
│ │ └── where.cpp
│ ├── plugins/
│ │ ├── common/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── http_sender.cpp
│ │ │ ├── include/
│ │ │ │ ├── http_sender.h
│ │ │ │ ├── libcurl_https.h
│ │ │ │ ├── piwebapi.h
│ │ │ │ ├── simple_http.h
│ │ │ │ └── simple_https.h
│ │ │ ├── libcurl_https.cpp
│ │ │ ├── piwebapi.cpp
│ │ │ ├── simple_http.cpp
│ │ │ └── simple_https.cpp
│ │ ├── filter/
│ │ │ └── common/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── filter.cpp
│ │ │ └── include/
│ │ │ └── filter.h
│ │ ├── north/
│ │ │ └── OMF/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── OMFError.cpp
│ │ │ ├── include/
│ │ │ │ ├── OMFHint.h
│ │ │ │ ├── basetypes.h
│ │ │ │ ├── linkedlookup.h
│ │ │ │ ├── ocs.h
│ │ │ │ ├── omf.h
│ │ │ │ ├── omfbuffer.h
│ │ │ │ ├── omferror.h
│ │ │ │ ├── omfinfo.h
│ │ │ │ └── omflinkeddata.h
│ │ │ ├── linkdata.cpp
│ │ │ ├── ocs.cpp
│ │ │ ├── omf.cpp
│ │ │ ├── omfbuffer.cpp
│ │ │ ├── omfhints.cpp
│ │ │ ├── omfinfo.cpp
│ │ │ └── plugin.cpp
│ │ ├── storage/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── README.rst
│ │ │ ├── common/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── disk_monitor.cpp
│ │ │ │ ├── include/
│ │ │ │ │ ├── disk_monitor.h
│ │ │ │ │ └── sql_buffer.h
│ │ │ │ └── sql_buffer.cpp
│ │ │ ├── postgres/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── CheckRhPg.cmake
│ │ │ │ ├── README.rst
│ │ │ │ ├── connection.cpp
│ │ │ │ ├── connection_manager.cpp
│ │ │ │ ├── include/
│ │ │ │ │ ├── connection.h
│ │ │ │ │ └── connection_manager.h
│ │ │ │ └── plugin.cpp
│ │ │ ├── sqlite/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── Findsqlite3.cmake
│ │ │ │ ├── common/
│ │ │ │ │ ├── connection.cpp
│ │ │ │ │ ├── connection_manager.cpp
│ │ │ │ │ ├── include/
│ │ │ │ │ │ ├── connection.h
│ │ │ │ │ │ ├── connection_manager.h
│ │ │ │ │ │ ├── purge_configuration.h
│ │ │ │ │ │ ├── readings_catalogue.h
│ │ │ │ │ │ └── sqlite_common.h
│ │ │ │ │ ├── purge_configuration.cpp
│ │ │ │ │ ├── readings.cpp
│ │ │ │ │ └── readings_catalogue.cpp
│ │ │ │ ├── include/
│ │ │ │ │ ├── common.h
│ │ │ │ │ └── profile.h
│ │ │ │ ├── plugin.cpp
│ │ │ │ └── schema/
│ │ │ │ ├── include/
│ │ │ │ │ └── schema.h
│ │ │ │ └── schema.cpp
│ │ │ ├── sqlitelb/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── Findsqlite3.cmake
│ │ │ │ ├── common/
│ │ │ │ │ ├── connection.cpp
│ │ │ │ │ ├── connection_manager.cpp
│ │ │ │ │ ├── include/
│ │ │ │ │ │ ├── connection.h
│ │ │ │ │ │ └── connection_manager.h
│ │ │ │ │ └── readings.cpp
│ │ │ │ ├── include/
│ │ │ │ │ ├── common.h
│ │ │ │ │ └── profile.h
│ │ │ │ └── plugin.cpp
│ │ │ └── sqlitememory/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── Findsqlite3.cmake
│ │ │ ├── connection.cpp
│ │ │ ├── include/
│ │ │ │ ├── connection.h
│ │ │ │ └── connection_manager.h
│ │ │ └── plugin.cpp
│ │ └── utils/
│ │ ├── CMakeLists.txt
│ │ ├── cmdutil.cpp
│ │ └── get_plugin_info.cpp
│ ├── services/
│ │ ├── common/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── README.rst
│ │ │ ├── config_handler.cpp
│ │ │ ├── filter_python_plugin_handle.cpp
│ │ │ ├── include/
│ │ │ │ ├── binary_plugin_handle.h
│ │ │ │ ├── config_handler.h
│ │ │ │ ├── filter_python_plugin_handle.h
│ │ │ │ ├── management_api.h
│ │ │ │ ├── north_python_plugin_handle.h
│ │ │ │ ├── notification_python_plugin_handle.h
│ │ │ │ ├── perfmonitors.h
│ │ │ │ ├── plugin.h
│ │ │ │ ├── plugin_api.h
│ │ │ │ ├── plugin_exception.h
│ │ │ │ ├── plugin_handle.h
│ │ │ │ ├── plugin_manager.h
│ │ │ │ ├── python_plugin_handle.h
│ │ │ │ ├── service_handler.h
│ │ │ │ └── south_python_plugin_handle.h
│ │ │ ├── management_api.cpp
│ │ │ ├── north_python_plugin_handle.cpp
│ │ │ ├── notification_python_plugin_handle.cpp
│ │ │ ├── perfmonitor.cpp
│ │ │ ├── plugin.cpp
│ │ │ ├── plugin_manager.cpp
│ │ │ ├── service_security.cpp
│ │ │ └── south_python_plugin_handle.cpp
│ │ ├── common-plugin-interfaces/
│ │ │ └── python/
│ │ │ └── include/
│ │ │ └── python_plugin_common_interface.h
│ │ ├── core/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── configuration_manager.cpp
│ │ │ ├── core_management_api.cpp
│ │ │ ├── include/
│ │ │ │ ├── configuration_manager.h
│ │ │ │ ├── core_management_api.h
│ │ │ │ └── service_registry.h
│ │ │ └── service_registry.cpp
│ │ ├── filter-plugin-interfaces/
│ │ │ └── python/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── filter_ingest_pymodule/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ └── ingest_callback_pymodule.cpp
│ │ │ └── python_plugin_interface.cpp
│ │ ├── north/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── README.rst
│ │ │ ├── data_load.cpp
│ │ │ ├── data_send.cpp
│ │ │ ├── include/
│ │ │ │ ├── data_load.h
│ │ │ │ ├── data_sender.h
│ │ │ │ ├── defaults.h
│ │ │ │ ├── north_api.h
│ │ │ │ ├── north_plugin.h
│ │ │ │ └── north_service.h
│ │ │ ├── north.cpp
│ │ │ ├── north_api.cpp
│ │ │ └── north_plugin.cpp
│ │ ├── north-plugin-interfaces/
│ │ │ └── python/
│ │ │ ├── CMakeLists.txt
│ │ │ └── python_plugin_interface.cpp
│ │ ├── notification-plugin-interfaces/
│ │ │ └── python/
│ │ │ ├── CMakeLists.txt
│ │ │ └── python_plugin_interface.cpp
│ │ ├── south/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── README.rst
│ │ │ ├── include/
│ │ │ │ ├── defaults.h
│ │ │ │ ├── ingest.h
│ │ │ │ ├── ingest_rate.h
│ │ │ │ ├── south_api.h
│ │ │ │ ├── south_plugin.h
│ │ │ │ └── south_service.h
│ │ │ ├── ingest.cpp
│ │ │ ├── ingestRate.cpp
│ │ │ ├── south.cpp
│ │ │ ├── south_api.cpp
│ │ │ └── south_plugin.cpp
│ │ ├── south-plugin-interfaces/
│ │ │ └── python/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── async_ingest_pymodule/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ └── ingest_callback_pymodule.cpp
│ │ │ └── python_plugin_interface.cpp
│ │ └── storage/
│ │ ├── CMakeLists.txt
│ │ ├── README.rst
│ │ ├── configuration.cpp
│ │ ├── include/
│ │ │ ├── configuration.h
│ │ │ ├── plugin_configuration.h
│ │ │ ├── storage_api.h
│ │ │ ├── storage_plugin.h
│ │ │ ├── storage_registry.h
│ │ │ ├── storage_service.h
│ │ │ ├── storage_stats.h
│ │ │ └── stream_handler.h
│ │ ├── pluginconfiguration.cpp
│ │ ├── storage
│ │ ├── storage.cpp
│ │ ├── storage_api.cpp
│ │ ├── storage_plugin.cpp
│ │ ├── storage_registry.cpp
│ │ ├── storage_stats.cpp
│ │ └── stream_handler.cpp
│ ├── tasks/
│ │ ├── check_updates/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── check_updates.cpp
│ │ │ ├── include/
│ │ │ │ └── check_updates.h
│ │ │ └── main.cpp
│ │ ├── north/
│ │ │ ├── CMakeLists.txt
│ │ │ └── sending_process/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── include/
│ │ │ │ ├── north_filter_pipeline.h
│ │ │ │ ├── north_plugin.h
│ │ │ │ └── sending.h
│ │ │ ├── north_filter_pipeline.cpp
│ │ │ ├── north_plugin.cpp
│ │ │ ├── sending.cpp
│ │ │ └── sending_process.cpp
│ │ ├── purge_system/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── include/
│ │ │ │ └── purge_system.h
│ │ │ ├── main.cpp
│ │ │ └── purge_system.cpp
│ │ └── statistics_history/
│ │ ├── CMakeLists.txt
│ │ ├── include/
│ │ │ └── stats_history.h
│ │ ├── main.cpp
│ │ └── stats_history.cpp
│ └── thirdparty/
│ ├── Simple-Web-Server/
│ │ ├── CMakeLists.txt
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── asio_compatibility.hpp
│ │ ├── client_http.hpp
│ │ ├── client_https.hpp
│ │ ├── crypto.hpp
│ │ ├── docs/
│ │ │ ├── Doxyfile
│ │ │ └── benchmarks.md
│ │ ├── http_examples.cpp
│ │ ├── https_examples.cpp
│ │ ├── mutex.hpp
│ │ ├── server_http.hpp
│ │ ├── server_https.hpp
│ │ ├── status_code.hpp
│ │ ├── tests/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── assert.hpp
│ │ │ ├── crypto_test.cpp
│ │ │ ├── io_test.cpp
│ │ │ ├── parse_test.cpp
│ │ │ └── status_code_test.cpp
│ │ ├── utility.hpp
│ │ └── web/
│ │ ├── index.html
│ │ └── test.html
│ └── rapidjson/
│ ├── .gitattributes
│ ├── .gitignore
│ ├── .gitmodules
│ ├── .travis.yml
│ ├── CHANGELOG.md
│ ├── CMakeLists.txt
│ ├── CMakeModules/
│ │ └── FindGTestSrc.cmake
│ ├── RapidJSON.pc.in
│ ├── RapidJSONConfig.cmake.in
│ ├── RapidJSONConfigVersion.cmake.in
│ ├── appveyor.yml
│ ├── bin/
│ │ ├── data/
│ │ │ ├── glossary.json
│ │ │ ├── menu.json
│ │ │ ├── readme.txt
│ │ │ ├── sample.json
│ │ │ ├── webapp.json
│ │ │ └── widget.json
│ │ ├── encodings/
│ │ │ ├── utf16be.json
│ │ │ ├── utf16bebom.json
│ │ │ ├── utf16le.json
│ │ │ ├── utf16lebom.json
│ │ │ ├── utf32be.json
│ │ │ ├── utf32bebom.json
│ │ │ ├── utf32le.json
│ │ │ ├── utf32lebom.json
│ │ │ ├── utf8.json
│ │ │ └── utf8bom.json
│ │ ├── jsonchecker/
│ │ │ ├── fail1.json
│ │ │ ├── fail10.json
│ │ │ ├── fail11.json
│ │ │ ├── fail12.json
│ │ │ ├── fail13.json
│ │ │ ├── fail14.json
│ │ │ ├── fail15.json
│ │ │ ├── fail16.json
│ │ │ ├── fail17.json
│ │ │ ├── fail18.json
│ │ │ ├── fail19.json
│ │ │ ├── fail2.json
│ │ │ ├── fail20.json
│ │ │ ├── fail21.json
│ │ │ ├── fail22.json
│ │ │ ├── fail23.json
│ │ │ ├── fail24.json
│ │ │ ├── fail25.json
│ │ │ ├── fail26.json
│ │ │ ├── fail27.json
│ │ │ ├── fail28.json
│ │ │ ├── fail29.json
│ │ │ ├── fail3.json
│ │ │ ├── fail30.json
│ │ │ ├── fail31.json
│ │ │ ├── fail32.json
│ │ │ ├── fail33.json
│ │ │ ├── fail4.json
│ │ │ ├── fail5.json
│ │ │ ├── fail6.json
│ │ │ ├── fail7.json
│ │ │ ├── fail8.json
│ │ │ ├── fail9.json
│ │ │ ├── pass1.json
│ │ │ ├── pass2.json
│ │ │ ├── pass3.json
│ │ │ └── readme.txt
│ │ └── types/
│ │ ├── booleans.json
│ │ ├── floats.json
│ │ ├── guids.json
│ │ ├── integers.json
│ │ ├── mixed.json
│ │ ├── nulls.json
│ │ ├── paragraphs.json
│ │ └── readme.txt
│ ├── contrib/
│ │ └── natvis/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── rapidjson.natvis
│ ├── doc/
│ │ ├── CMakeLists.txt
│ │ ├── Doxyfile.in
│ │ ├── Doxyfile.zh-cn.in
│ │ ├── diagram/
│ │ │ ├── architecture.dot
│ │ │ ├── insituparsing.dot
│ │ │ ├── iterative-parser-states-diagram.dot
│ │ │ ├── move1.dot
│ │ │ ├── move2.dot
│ │ │ ├── move3.dot
│ │ │ ├── normalparsing.dot
│ │ │ ├── simpledom.dot
│ │ │ ├── tutorial.dot
│ │ │ └── utilityclass.dot
│ │ ├── dom.md
│ │ ├── dom.zh-cn.md
│ │ ├── encoding.md
│ │ ├── encoding.zh-cn.md
│ │ ├── faq.md
│ │ ├── faq.zh-cn.md
│ │ ├── features.md
│ │ ├── features.zh-cn.md
│ │ ├── internals.md
│ │ ├── internals.zh-cn.md
│ │ ├── misc/
│ │ │ ├── DoxygenLayout.xml
│ │ │ ├── doxygenextra.css
│ │ │ ├── footer.html
│ │ │ └── header.html
│ │ ├── npm.md
│ │ ├── performance.md
│ │ ├── performance.zh-cn.md
│ │ ├── pointer.md
│ │ ├── pointer.zh-cn.md
│ │ ├── sax.md
│ │ ├── sax.zh-cn.md
│ │ ├── schema.md
│ │ ├── schema.zh-cn.md
│ │ ├── stream.md
│ │ ├── stream.zh-cn.md
│ │ ├── tutorial.md
│ │ └── tutorial.zh-cn.md
│ ├── example/
│ │ ├── CMakeLists.txt
│ │ ├── capitalize/
│ │ │ └── capitalize.cpp
│ │ ├── condense/
│ │ │ └── condense.cpp
│ │ ├── filterkey/
│ │ │ └── filterkey.cpp
│ │ ├── filterkeydom/
│ │ │ └── filterkeydom.cpp
│ │ ├── jsonx/
│ │ │ └── jsonx.cpp
│ │ ├── lookaheadparser/
│ │ │ └── lookaheadparser.cpp
│ │ ├── messagereader/
│ │ │ └── messagereader.cpp
│ │ ├── parsebyparts/
│ │ │ └── parsebyparts.cpp
│ │ ├── pretty/
│ │ │ └── pretty.cpp
│ │ ├── prettyauto/
│ │ │ └── prettyauto.cpp
│ │ ├── schemavalidator/
│ │ │ └── schemavalidator.cpp
│ │ ├── serialize/
│ │ │ └── serialize.cpp
│ │ ├── simpledom/
│ │ │ └── simpledom.cpp
│ │ ├── simplepullreader/
│ │ │ └── simplepullreader.cpp
│ │ ├── simplereader/
│ │ │ └── simplereader.cpp
│ │ ├── simplewriter/
│ │ │ └── simplewriter.cpp
│ │ └── tutorial/
│ │ └── tutorial.cpp
│ ├── include/
│ │ └── rapidjson/
│ │ ├── allocators.h
│ │ ├── cursorstreamwrapper.h
│ │ ├── document.h
│ │ ├── encodedstream.h
│ │ ├── encodings.h
│ │ ├── error/
│ │ │ ├── en.h
│ │ │ └── error.h
│ │ ├── filereadstream.h
│ │ ├── filewritestream.h
│ │ ├── fwd.h
│ │ ├── internal/
│ │ │ ├── biginteger.h
│ │ │ ├── clzll.h
│ │ │ ├── diyfp.h
│ │ │ ├── dtoa.h
│ │ │ ├── ieee754.h
│ │ │ ├── itoa.h
│ │ │ ├── meta.h
│ │ │ ├── pow10.h
│ │ │ ├── regex.h
│ │ │ ├── stack.h
│ │ │ ├── strfunc.h
│ │ │ ├── strtod.h
│ │ │ └── swap.h
│ │ ├── istreamwrapper.h
│ │ ├── memorybuffer.h
│ │ ├── memorystream.h
│ │ ├── msinttypes/
│ │ │ ├── inttypes.h
│ │ │ └── stdint.h
│ │ ├── ostreamwrapper.h
│ │ ├── pointer.h
│ │ ├── prettywriter.h
│ │ ├── rapidjson.h
│ │ ├── reader.h
│ │ ├── schema.h
│ │ ├── stream.h
│ │ ├── stringbuffer.h
│ │ ├── uri.h
│ │ └── writer.h
│ ├── include_dirs.js
│ ├── library.json
│ ├── license.txt
│ ├── package.json
│ ├── rapidjson.autopkg
│ ├── readme.md
│ ├── readme.zh-cn.md
│ ├── test/
│ │ ├── CMakeLists.txt
│ │ ├── perftest/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── misctest.cpp
│ │ │ ├── perftest.cpp
│ │ │ ├── perftest.h
│ │ │ ├── platformtest.cpp
│ │ │ ├── rapidjsontest.cpp
│ │ │ └── schematest.cpp
│ │ ├── unittest/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── allocatorstest.cpp
│ │ │ ├── bigintegertest.cpp
│ │ │ ├── documenttest.cpp
│ │ │ ├── dtoatest.cpp
│ │ │ ├── encodedstreamtest.cpp
│ │ │ ├── encodingstest.cpp
│ │ │ ├── filestreamtest.cpp
│ │ │ ├── fwdtest.cpp
│ │ │ ├── istreamwrappertest.cpp
│ │ │ ├── itoatest.cpp
│ │ │ ├── jsoncheckertest.cpp
│ │ │ ├── namespacetest.cpp
│ │ │ ├── ostreamwrappertest.cpp
│ │ │ ├── pointertest.cpp
│ │ │ ├── prettywritertest.cpp
│ │ │ ├── readertest.cpp
│ │ │ ├── regextest.cpp
│ │ │ ├── schematest.cpp
│ │ │ ├── simdtest.cpp
│ │ │ ├── strfunctest.cpp
│ │ │ ├── stringbuffertest.cpp
│ │ │ ├── strtodtest.cpp
│ │ │ ├── unittest.cpp
│ │ │ ├── unittest.h
│ │ │ ├── valuetest.cpp
│ │ │ └── writertest.cpp
│ │ └── valgrind.supp
│ └── travis-doxygen.sh
├── CMakeLists.txt
├── CONTRIBUTING.md
├── GOVERNANCE.MD
├── LICENSE
├── Makefile
├── README.rst
├── SECURITY.MD
├── VERSION
├── contrib/
│ └── .gitkeep
├── data/
│ ├── etc/
│ │ └── kerberos/
│ │ └── README.rst
│ └── extras/
│ └── fogbench/
│ └── fogbench_sensor_coap.template.json
├── dco-signoffs/
│ ├── AmandeepSinghArora-dco-signoff.txt
│ ├── AshishJabble-dco-signoff.txt
│ ├── AshwinGopalakrishnan-dco-signoff.txt
│ ├── BillHunt-dco-signoff.txt
│ ├── MarkRiddoch-dco-signoff.txt
│ ├── MassimilianoPinto-dco-signoff.txt
│ ├── MohdShariq-dco-signoff.txt
│ ├── MonikaSharma-dco-signoff.txt
│ ├── OriShadmon-dco-signoff.txt
│ ├── PraveenGarg-dco-signoff.txt
│ ├── StefanoSimonelli-dco-signoff.txt
│ ├── YashTatkondawar-dco-signoff.txt
│ └── other-dco-signoff.txt
├── docs/
│ ├── 91_version_history.rst
│ ├── 92_downloads.rst
│ ├── KERBEROS.rst
│ ├── Makefile
│ ├── OMF.rst
│ ├── RASPBIAN.rst
│ ├── _static/
│ │ ├── .gitkeep
│ │ ├── theme_overrides.css
│ │ └── version_menu.css
│ ├── _templates/
│ │ └── breadcrumbs.html
│ ├── acl.rst
│ ├── build_index.rst
│ ├── building_fledge/
│ │ ├── 01_introduction.rst
│ │ ├── 04_installation.rst
│ │ ├── 04_utilities.rst
│ │ ├── 05_tasks.rst
│ │ ├── 06_testing.rst
│ │ ├── building_fledge.rst
│ │ └── index.rst
│ ├── building_pipelines.rst
│ ├── check-sphinx.py
│ ├── conf.py
│ ├── control.rst
│ ├── control_scripts.rst
│ ├── fledge-north-OMF.rst
│ ├── fledge-rule-DataAvailability/
│ │ └── index.rst
│ ├── fledge-rule-Threshold/
│ │ └── index.rst
│ ├── fledge_architecture.rst
│ ├── glossary.rst
│ ├── index.rst
│ ├── introduction.rst
│ ├── keywords/
│ │ ├── Augmentation
│ │ ├── Cleansing
│ │ ├── Cloud
│ │ ├── Compression
│ │ ├── Governance
│ │ ├── Image
│ │ ├── Labelling
│ │ ├── MQTT
│ │ ├── Mathematical
│ │ ├── ModelExecution
│ │ ├── Namespace
│ │ ├── PLC
│ │ ├── README.rst
│ │ ├── Scripted
│ │ ├── Signal Processing
│ │ ├── Simulation
│ │ ├── Structure
│ │ ├── Textual
│ │ └── Vibration
│ ├── make.bat
│ ├── monitoring/
│ │ ├── configuration.rst
│ │ ├── flow.rst
│ │ ├── index.rst
│ │ ├── introduction.rst
│ │ ├── quality.rst
│ │ ├── resources.rst
│ │ └── service.rst
│ ├── plugin_developers_guide/
│ │ ├── 00_source_code_doc.rst
│ │ ├── 01_01_Data.rst
│ │ ├── 01_Fledge_plugins.rst
│ │ ├── 02_persisting_data.rst
│ │ ├── 02_writing_plugins.rst
│ │ ├── 035_CPP.rst
│ │ ├── 037_hybrid_plugins.rst
│ │ ├── 03_01_DHT11.rst
│ │ ├── 03_02_Control.rst
│ │ ├── 03_02_DHT11_C.rst
│ │ ├── 03_02_south_python_Control.rst
│ │ ├── 03_south_C_plugins.rst
│ │ ├── 03_south_plugins.rst
│ │ ├── 04_north_plugins.rst
│ │ ├── 05_storage_plugins.rst
│ │ ├── 06_filter_plugins.rst
│ │ ├── 07_rules_plugins.rst
│ │ ├── 08_notify_plugins.rst
│ │ ├── 08_storage.rst
│ │ ├── 09_packaging.rst
│ │ ├── 10_testing.rst
│ │ ├── 11_WSL2.rst
│ │ └── index.rst
│ ├── plugin_index.rst
│ ├── processing_data.rst
│ ├── quick_start/
│ │ ├── backup.rst
│ │ ├── datasources.rst
│ │ ├── gui.rst
│ │ ├── index.rst
│ │ ├── installing.rst
│ │ ├── instructions.txt
│ │ ├── north.rst
│ │ ├── platforms.rst
│ │ ├── starting.rst
│ │ ├── support.rst
│ │ ├── troubleshooting.rst
│ │ ├── uninstalling.rst
│ │ ├── update.rst
│ │ └── viewing.rst
│ ├── requirements.txt
│ ├── rest_api_guide/
│ │ ├── 01_REST.rst
│ │ ├── 02_RESTauthentication.rst
│ │ ├── 03_RESTadmin.rst
│ │ ├── 03_RESTassetTracker.rst
│ │ ├── 03_RESTservices.rst
│ │ ├── 03_RESTstatistics.rst
│ │ ├── 03_RESTupdate.rst
│ │ ├── 04_RESTuser.rst
│ │ ├── 05_RESTdeveloper.rst
│ │ ├── 06_GrafanaExamples.rst
│ │ └── index.rst
│ ├── scripts/
│ │ ├── fledge_plugin_list
│ │ └── plugin_and_service_documentation
│ ├── securing_fledge.rst
│ ├── storage.rst
│ ├── troubleshooting_pi-server_integration.rst
│ └── tuning_fledge.rst
├── doxy.config
├── extras/
│ ├── python/
│ │ ├── .gitignore
│ │ └── fogbench/
│ │ ├── __init__.py
│ │ ├── __main__.py
│ │ └── exceptions.py
│ └── scripts/
│ ├── fledge.service
│ └── setenv.sh
├── mkversion
├── python/
│ ├── .gitignore
│ ├── .pylintrc
│ ├── __init__.py
│ ├── __template__.py
│ ├── fledge/
│ │ ├── __init__.py
│ │ ├── apps/
│ │ │ ├── __init__.py
│ │ │ └── common/
│ │ │ ├── README.rst
│ │ │ └── __init__.py
│ │ ├── common/
│ │ │ ├── README.rst
│ │ │ ├── __init__.py
│ │ │ ├── acl_manager.py
│ │ │ ├── alert_manager.py
│ │ │ ├── audit_logger.py
│ │ │ ├── common.py
│ │ │ ├── configuration_manager.py
│ │ │ ├── iprpc.py
│ │ │ ├── logger.py
│ │ │ ├── microservice_management_client/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── exceptions.py
│ │ │ │ └── microservice_management_client.py
│ │ │ ├── parser.py
│ │ │ ├── plugin_discovery.py
│ │ │ ├── plugin_helpers.py
│ │ │ ├── process.py
│ │ │ ├── service_record.py
│ │ │ ├── statistics.py
│ │ │ ├── storage_client/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── payload_builder.py
│ │ │ │ ├── storage_client.py
│ │ │ │ └── utils.py
│ │ │ ├── utils.py
│ │ │ └── web/
│ │ │ ├── __init__.py
│ │ │ ├── middleware.py
│ │ │ └── ssl_wrapper.py
│ │ ├── plugins/
│ │ │ ├── __init__.py
│ │ │ ├── common/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── shim/
│ │ │ │ │ └── __init__.py
│ │ │ │ └── utils.py
│ │ │ ├── north/
│ │ │ │ ├── README.rst
│ │ │ │ ├── __init__.py
│ │ │ │ ├── common/
│ │ │ │ │ ├── README.rst
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── common.py
│ │ │ │ │ └── exceptions.py
│ │ │ │ └── empty/
│ │ │ │ ├── README.rst
│ │ │ │ ├── __init__.py
│ │ │ │ └── empty.py
│ │ │ └── storage/
│ │ │ ├── __init__.py
│ │ │ ├── common/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── backup.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── lib.py
│ │ │ │ └── restore.py
│ │ │ ├── postgres/
│ │ │ │ ├── __init__.py
│ │ │ │ └── backup_restore/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── backup_postgres.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── lib.py
│ │ │ │ └── restore_postgres.py
│ │ │ └── sqlite/
│ │ │ ├── __init__.py
│ │ │ └── backup_restore/
│ │ │ ├── __init__.py
│ │ │ ├── backup_sqlite.py
│ │ │ └── restore_sqlite.py
│ │ ├── services/
│ │ │ ├── __init__.py
│ │ │ ├── common/
│ │ │ │ ├── README.rst
│ │ │ │ ├── __init__.py
│ │ │ │ ├── microservice.py
│ │ │ │ ├── microservice_management/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── routes.py
│ │ │ │ ├── service_announcer.py
│ │ │ │ └── utils.py
│ │ │ ├── core/
│ │ │ │ ├── README.rst
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __main__.py
│ │ │ │ ├── api/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── alerts.py
│ │ │ │ │ ├── asset_tracker.py
│ │ │ │ │ ├── audit.py
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── backup_restore.py
│ │ │ │ │ ├── browser.py
│ │ │ │ │ ├── certificate_store.py
│ │ │ │ │ ├── common.py
│ │ │ │ │ ├── configuration.py
│ │ │ │ │ ├── control_service/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── acl_management.py
│ │ │ │ │ │ ├── entrypoint.py
│ │ │ │ │ │ ├── exceptions.py
│ │ │ │ │ │ ├── pipeline.py
│ │ │ │ │ │ └── script_management.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── filters.py
│ │ │ │ │ ├── health.py
│ │ │ │ │ ├── north.py
│ │ │ │ │ ├── notification.py
│ │ │ │ │ ├── package_log.py
│ │ │ │ │ ├── performance_monitor.py
│ │ │ │ │ ├── pipeline_debugger.py
│ │ │ │ │ ├── plugins/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── common.py
│ │ │ │ │ │ ├── config_validator.py
│ │ │ │ │ │ ├── data.py
│ │ │ │ │ │ ├── discovery.py
│ │ │ │ │ │ ├── exceptions.py
│ │ │ │ │ │ ├── install.py
│ │ │ │ │ │ ├── remove.py
│ │ │ │ │ │ └── update.py
│ │ │ │ │ ├── python_packages.py
│ │ │ │ │ ├── repos/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── configure.py
│ │ │ │ │ ├── scheduler.py
│ │ │ │ │ ├── service.py
│ │ │ │ │ ├── snapshot/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── plugins.py
│ │ │ │ │ │ └── table.py
│ │ │ │ │ ├── south.py
│ │ │ │ │ ├── statistics.py
│ │ │ │ │ ├── support.py
│ │ │ │ │ ├── task.py
│ │ │ │ │ ├── update.py
│ │ │ │ │ └── utils.py
│ │ │ │ ├── asset_tracker/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── asset_tracker.py
│ │ │ │ ├── connect.py
│ │ │ │ ├── firewall.py
│ │ │ │ ├── interest_registry/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── change_callback.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── interest_record.py
│ │ │ │ │ └── interest_registry.py
│ │ │ │ ├── proxy.py
│ │ │ │ ├── routes.py
│ │ │ │ ├── scheduler/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── entities.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ └── scheduler.py
│ │ │ │ ├── server.py
│ │ │ │ ├── service_registry/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── monitor.py
│ │ │ │ │ └── service_registry.py
│ │ │ │ ├── snapshot.py
│ │ │ │ ├── support.py
│ │ │ │ └── user_model.py
│ │ │ └── south/
│ │ │ ├── __init__.py
│ │ │ └── exceptions.py
│ │ └── tasks/
│ │ ├── README.rst
│ │ ├── __init__.py
│ │ ├── automation_script/
│ │ │ ├── __init__.py
│ │ │ └── __main__.py
│ │ ├── common/
│ │ │ ├── README.rst
│ │ │ └── __init__.py
│ │ ├── purge/
│ │ │ ├── README.rst
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ └── purge.py
│ │ └── statistics/
│ │ ├── README.rst
│ │ ├── __init__.py
│ │ ├── __main__.py
│ │ └── statistics_history.py
│ ├── requirements-dev.txt
│ ├── requirements-test.txt
│ ├── requirements.txt
│ ├── setup.py
│ └── thirdparty/
│ └── README.rst
├── requirements.sh
├── scripts/
│ ├── __template__.sh
│ ├── auth_certificates
│ ├── certificates
│ ├── common/
│ │ ├── README.rst
│ │ ├── audittime.py
│ │ ├── check_schema_update.sh
│ │ ├── disk_usage.py
│ │ ├── get_engine_management.sh
│ │ ├── get_logs.sh
│ │ ├── get_platform.sh
│ │ ├── get_readings_plugin.sh
│ │ ├── get_storage_plugin.sh
│ │ ├── json_parse.py
│ │ ├── loglevel.py
│ │ ├── service_status.py
│ │ ├── try_catch.sh
│ │ └── write_log.sh
│ ├── debug/
│ │ ├── .debugrc
│ │ ├── README.rst
│ │ ├── attach
│ │ ├── buffer
│ │ ├── commands
│ │ ├── debug
│ │ ├── detach
│ │ ├── isolate
│ │ ├── replay
│ │ ├── resumeIngest
│ │ ├── setBuffer
│ │ ├── state
│ │ ├── step
│ │ ├── store
│ │ └── suspendIngest
│ ├── extras/
│ │ ├── fledge.sudoers
│ │ ├── fledge.sudoers_rh
│ │ ├── fledge_update
│ │ ├── fogbench
│ │ ├── update_task.apt
│ │ ├── update_task.snappy
│ │ └── update_task.yum
│ ├── fledge
│ ├── fledge_mnt
│ ├── package/
│ │ └── debian/
│ │ ├── package_update.sh
│ │ └── upgrade/
│ │ ├── 1.4.sh
│ │ ├── 1.5.sh
│ │ └── 1.8.sh
│ ├── plugins/
│ │ └── storage/
│ │ ├── postgres/
│ │ │ ├── downgrade/
│ │ │ │ ├── 1.sql
│ │ │ │ ├── 10.sql
│ │ │ │ ├── 11.sql
│ │ │ │ ├── 12.sql
│ │ │ │ ├── 13.sql
│ │ │ │ ├── 14.sql
│ │ │ │ ├── 15.sql
│ │ │ │ ├── 16.sql
│ │ │ │ ├── 17.sql
│ │ │ │ ├── 18.sql
│ │ │ │ ├── 19.sql
│ │ │ │ ├── 2.sql
│ │ │ │ ├── 20.sql
│ │ │ │ ├── 21.sql
│ │ │ │ ├── 22.sql
│ │ │ │ ├── 23.sql
│ │ │ │ ├── 24.sql
│ │ │ │ ├── 25.sql
│ │ │ │ ├── 26.sql
│ │ │ │ ├── 27.sql
│ │ │ │ ├── 28.sql
│ │ │ │ ├── 29.sql
│ │ │ │ ├── 3.sql
│ │ │ │ ├── 30.sql
│ │ │ │ ├── 31.sql
│ │ │ │ ├── 32.sql
│ │ │ │ ├── 33.sql
│ │ │ │ ├── 34.sql
│ │ │ │ ├── 35.sql
│ │ │ │ ├── 36.sql
│ │ │ │ ├── 37.sql
│ │ │ │ ├── 38.sql
│ │ │ │ ├── 39.sql
│ │ │ │ ├── 4.sql
│ │ │ │ ├── 40.sql
│ │ │ │ ├── 41.sql
│ │ │ │ ├── 42.sql
│ │ │ │ ├── 43.sql
│ │ │ │ ├── 44.sql
│ │ │ │ ├── 45.sql
│ │ │ │ ├── 46.sql
│ │ │ │ ├── 47.sql
│ │ │ │ ├── 48.sql
│ │ │ │ ├── 49.sql
│ │ │ │ ├── 5.sql
│ │ │ │ ├── 50.sql
│ │ │ │ ├── 51.sql
│ │ │ │ ├── 52.sql
│ │ │ │ ├── 53.sql
│ │ │ │ ├── 54.sql
│ │ │ │ ├── 55.sql
│ │ │ │ ├── 56.sql
│ │ │ │ ├── 57.sql
│ │ │ │ ├── 58.sql
│ │ │ │ ├── 59.sql
│ │ │ │ ├── 6.sql
│ │ │ │ ├── 60.sql
│ │ │ │ ├── 61.sql
│ │ │ │ ├── 62.sql
│ │ │ │ ├── 63.sql
│ │ │ │ ├── 64.sql
│ │ │ │ ├── 65.sql
│ │ │ │ ├── 66.sql
│ │ │ │ ├── 67.sql
│ │ │ │ ├── 68.sql
│ │ │ │ ├── 69.sql
│ │ │ │ ├── 7.sql
│ │ │ │ ├── 70.sql
│ │ │ │ ├── 71.sql
│ │ │ │ ├── 72.sql
│ │ │ │ ├── 73.sql
│ │ │ │ ├── 74.sql
│ │ │ │ ├── 75.sql
│ │ │ │ ├── 8.sql
│ │ │ │ ├── 9.sql
│ │ │ │ └── README
│ │ │ ├── init.sql
│ │ │ ├── schema_update.sh
│ │ │ └── upgrade/
│ │ │ ├── 10.sql
│ │ │ ├── 11.sql
│ │ │ ├── 12.sql
│ │ │ ├── 13.sql
│ │ │ ├── 14.sql
│ │ │ ├── 15.sql
│ │ │ ├── 16.sql
│ │ │ ├── 17.sql
│ │ │ ├── 18.sql
│ │ │ ├── 19.sql
│ │ │ ├── 2.sql
│ │ │ ├── 20.sql
│ │ │ ├── 21.sql
│ │ │ ├── 22.sql
│ │ │ ├── 23.sql
│ │ │ ├── 24.sql
│ │ │ ├── 25.sql
│ │ │ ├── 26.sql
│ │ │ ├── 27.sql
│ │ │ ├── 28.sql
│ │ │ ├── 29.sql
│ │ │ ├── 3.sql
│ │ │ ├── 30.sql
│ │ │ ├── 31.sql
│ │ │ ├── 32.sql
│ │ │ ├── 33.sql
│ │ │ ├── 34.sql
│ │ │ ├── 35.sql
│ │ │ ├── 36.sql
│ │ │ ├── 37.sql
│ │ │ ├── 38.sql
│ │ │ ├── 39.sql
│ │ │ ├── 4.sql
│ │ │ ├── 40.sql
│ │ │ ├── 41.sql
│ │ │ ├── 42.sql
│ │ │ ├── 43.sql
│ │ │ ├── 44.sql
│ │ │ ├── 45.sql
│ │ │ ├── 46.sql
│ │ │ ├── 47.sql
│ │ │ ├── 48.sql
│ │ │ ├── 49.sql
│ │ │ ├── 5.sql
│ │ │ ├── 50.sql
│ │ │ ├── 51.sql
│ │ │ ├── 52.sql
│ │ │ ├── 53.sql
│ │ │ ├── 54.sql
│ │ │ ├── 55.sql
│ │ │ ├── 56.sql
│ │ │ ├── 57.sql
│ │ │ ├── 58.sql
│ │ │ ├── 59.sql
│ │ │ ├── 6.sql
│ │ │ ├── 60.sql
│ │ │ ├── 61.sql
│ │ │ ├── 62.sql
│ │ │ ├── 63.sql
│ │ │ ├── 64.sql
│ │ │ ├── 65.sql
│ │ │ ├── 66.sql
│ │ │ ├── 67.sql
│ │ │ ├── 68.sql
│ │ │ ├── 69.sql
│ │ │ ├── 7.sql
│ │ │ ├── 70.sql
│ │ │ ├── 71.sql
│ │ │ ├── 72.sql
│ │ │ ├── 73.sql
│ │ │ ├── 74.sql
│ │ │ ├── 75.sql
│ │ │ ├── 76.sql
│ │ │ ├── 8.sql
│ │ │ ├── 9.sql
│ │ │ └── README
│ │ ├── postgres.sh
│ │ ├── sqlite/
│ │ │ ├── downgrade/
│ │ │ │ ├── 1.sql
│ │ │ │ ├── 10.sql
│ │ │ │ ├── 11.sql
│ │ │ │ ├── 12.sql
│ │ │ │ ├── 13.sql
│ │ │ │ ├── 14.sql
│ │ │ │ ├── 15.sql
│ │ │ │ ├── 16.sql
│ │ │ │ ├── 17.sql
│ │ │ │ ├── 18.sql
│ │ │ │ ├── 19.sql
│ │ │ │ ├── 2.sql
│ │ │ │ ├── 20.sql
│ │ │ │ ├── 21.sql
│ │ │ │ ├── 22.sql
│ │ │ │ ├── 23.sql
│ │ │ │ ├── 24.sql
│ │ │ │ ├── 25.sql
│ │ │ │ ├── 26.sql
│ │ │ │ ├── 27.sql
│ │ │ │ ├── 28.sql
│ │ │ │ ├── 29.sql
│ │ │ │ ├── 3.sql
│ │ │ │ ├── 30.sql
│ │ │ │ ├── 31.sql
│ │ │ │ ├── 32.sql
│ │ │ │ ├── 33.sql
│ │ │ │ ├── 34.sh
│ │ │ │ ├── 34.sql
│ │ │ │ ├── 35.sql
│ │ │ │ ├── 36.sql
│ │ │ │ ├── 37.sh
│ │ │ │ ├── 37.sql
│ │ │ │ ├── 38.sql
│ │ │ │ ├── 39.sql
│ │ │ │ ├── 4.sql
│ │ │ │ ├── 40.sql
│ │ │ │ ├── 41.sql
│ │ │ │ ├── 42.sql
│ │ │ │ ├── 43.sql
│ │ │ │ ├── 44.sql
│ │ │ │ ├── 45.sql
│ │ │ │ ├── 46.sql
│ │ │ │ ├── 47.sql
│ │ │ │ ├── 48.sql
│ │ │ │ ├── 49.sql
│ │ │ │ ├── 5.sql
│ │ │ │ ├── 50.sql
│ │ │ │ ├── 51.sql
│ │ │ │ ├── 52.sql
│ │ │ │ ├── 53.sql
│ │ │ │ ├── 54.sql
│ │ │ │ ├── 55.sql
│ │ │ │ ├── 56.sql
│ │ │ │ ├── 57.sql
│ │ │ │ ├── 58.sql
│ │ │ │ ├── 59.sql
│ │ │ │ ├── 6.sql
│ │ │ │ ├── 60.sql
│ │ │ │ ├── 61.sql
│ │ │ │ ├── 62.sql
│ │ │ │ ├── 63.sql
│ │ │ │ ├── 64.sql
│ │ │ │ ├── 65.sql
│ │ │ │ ├── 66.sql
│ │ │ │ ├── 67.sql
│ │ │ │ ├── 68.sql
│ │ │ │ ├── 69.sql
│ │ │ │ ├── 7.sql
│ │ │ │ ├── 70.sql
│ │ │ │ ├── 71.sql
│ │ │ │ ├── 72.sql
│ │ │ │ ├── 73.sql
│ │ │ │ ├── 74.sql
│ │ │ │ ├── 75.sql
│ │ │ │ ├── 8.sql
│ │ │ │ ├── 9.sql
│ │ │ │ └── README
│ │ │ ├── init.sql
│ │ │ ├── init_readings.sql
│ │ │ ├── schema_update.sh
│ │ │ └── upgrade/
│ │ │ ├── 10.sql
│ │ │ ├── 11.sql
│ │ │ ├── 12.sql
│ │ │ ├── 13.sql
│ │ │ ├── 14.sql
│ │ │ ├── 15.sql
│ │ │ ├── 16.sql
│ │ │ ├── 17.sql
│ │ │ ├── 18.sql
│ │ │ ├── 19.sql
│ │ │ ├── 2.sql
│ │ │ ├── 20.sql
│ │ │ ├── 21.sql
│ │ │ ├── 22.sql
│ │ │ ├── 23.sql
│ │ │ ├── 24.sql
│ │ │ ├── 25.sql
│ │ │ ├── 26.sql
│ │ │ ├── 27.sql
│ │ │ ├── 28.sql
│ │ │ ├── 29.sql
│ │ │ ├── 3.sql
│ │ │ ├── 30.sql
│ │ │ ├── 31.sql
│ │ │ ├── 32.sql
│ │ │ ├── 33.sql
│ │ │ ├── 34.sql
│ │ │ ├── 35.sh
│ │ │ ├── 35.sql
│ │ │ ├── 36.sql
│ │ │ ├── 37.sql
│ │ │ ├── 38.sh
│ │ │ ├── 38.sql
│ │ │ ├── 39.sql
│ │ │ ├── 4.sql
│ │ │ ├── 40.sql
│ │ │ ├── 41.sql
│ │ │ ├── 42.sql
│ │ │ ├── 43.sql
│ │ │ ├── 44.sql
│ │ │ ├── 45.sql
│ │ │ ├── 46.sql
│ │ │ ├── 47.sql
│ │ │ ├── 48.sql
│ │ │ ├── 49.sql
│ │ │ ├── 5.sql
│ │ │ ├── 50.sql
│ │ │ ├── 51.sql
│ │ │ ├── 52.sql
│ │ │ ├── 53.sql
│ │ │ ├── 54.sql
│ │ │ ├── 55.sql
│ │ │ ├── 56.sql
│ │ │ ├── 57.sql
│ │ │ ├── 58.sql
│ │ │ ├── 59.sql
│ │ │ ├── 6.sql
│ │ │ ├── 60.sql
│ │ │ ├── 61.sql
│ │ │ ├── 62.sql
│ │ │ ├── 63.sql
│ │ │ ├── 64.sql
│ │ │ ├── 65.sql
│ │ │ ├── 66.sql
│ │ │ ├── 67.sql
│ │ │ ├── 68.sql
│ │ │ ├── 69.sql
│ │ │ ├── 7.sql
│ │ │ ├── 70.sql
│ │ │ ├── 71.sql
│ │ │ ├── 72.sql
│ │ │ ├── 73.sql
│ │ │ ├── 74.sql
│ │ │ ├── 75.sql
│ │ │ ├── 76.sql
│ │ │ ├── 8.sql
│ │ │ ├── 9.sql
│ │ │ └── README
│ │ ├── sqlite.sh
│ │ ├── sqlitelb/
│ │ │ ├── downgrade/
│ │ │ │ ├── 42.sql
│ │ │ │ ├── 43.sql
│ │ │ │ ├── 44.sql
│ │ │ │ ├── 45.sql
│ │ │ │ ├── 46.sql
│ │ │ │ ├── 47.sql
│ │ │ │ ├── 48.sql
│ │ │ │ ├── 49.sql
│ │ │ │ ├── 50.sql
│ │ │ │ ├── 51.sql
│ │ │ │ ├── 52.sql
│ │ │ │ ├── 53.sql
│ │ │ │ ├── 54.sql
│ │ │ │ ├── 55.sql
│ │ │ │ ├── 56.sql
│ │ │ │ ├── 57.sql
│ │ │ │ ├── 58.sql
│ │ │ │ ├── 59.sql
│ │ │ │ ├── 60.sql
│ │ │ │ ├── 61.sql
│ │ │ │ ├── 62.sql
│ │ │ │ ├── 63.sql
│ │ │ │ ├── 64.sql
│ │ │ │ ├── 65.sql
│ │ │ │ ├── 66.sql
│ │ │ │ ├── 67.sql
│ │ │ │ ├── 68.sql
│ │ │ │ ├── 69.sql
│ │ │ │ ├── 70.sql
│ │ │ │ ├── 71.sql
│ │ │ │ ├── 72.sql
│ │ │ │ ├── 73.sql
│ │ │ │ ├── 74.sql
│ │ │ │ ├── 75.sql
│ │ │ │ └── README
│ │ │ ├── init.sql
│ │ │ ├── init_readings.sql
│ │ │ ├── schema_update.sh
│ │ │ └── upgrade/
│ │ │ ├── 43.sql
│ │ │ ├── 44.sql
│ │ │ ├── 45.sql
│ │ │ ├── 46.sql
│ │ │ ├── 47.sql
│ │ │ ├── 48.sql
│ │ │ ├── 49.sql
│ │ │ ├── 50.sql
│ │ │ ├── 51.sql
│ │ │ ├── 52.sql
│ │ │ ├── 53.sql
│ │ │ ├── 54.sql
│ │ │ ├── 55.sql
│ │ │ ├── 56.sql
│ │ │ ├── 57.sql
│ │ │ ├── 58.sql
│ │ │ ├── 59.sql
│ │ │ ├── 60.sql
│ │ │ ├── 61.sql
│ │ │ ├── 62.sql
│ │ │ ├── 63.sql
│ │ │ ├── 64.sql
│ │ │ ├── 65.sql
│ │ │ ├── 66.sql
│ │ │ ├── 67.sql
│ │ │ ├── 68.sql
│ │ │ ├── 69.sql
│ │ │ ├── 70.sql
│ │ │ ├── 71.sql
│ │ │ ├── 72.sql
│ │ │ ├── 73.sql
│ │ │ ├── 74.sql
│ │ │ ├── 75.sql
│ │ │ ├── 76.sql
│ │ │ └── README
│ │ └── sqlitelb.sh
│ ├── services/
│ │ ├── README.rst
│ │ ├── bucket_storage_c
│ │ ├── dispatcher_c
│ │ ├── north_C
│ │ ├── notification_c
│ │ ├── pipeline_c
│ │ ├── south_c
│ │ └── storage
│ ├── storage
│ └── tasks/
│ ├── README.rst
│ ├── automation_script
│ ├── backup
│ ├── check_certs
│ ├── check_updates
│ ├── north_c
│ ├── purge
│ ├── purge_system
│ ├── restore
│ └── statistics
├── tests/
│ ├── .gitignore
│ ├── README.rst
│ ├── __init__.py
│ ├── system/
│ │ ├── __init__.py
│ │ ├── common/
│ │ │ ├── clean_pi_system.py
│ │ │ └── scripts/
│ │ │ └── reset_user_authentication
│ │ ├── lab/
│ │ │ ├── README.rst
│ │ │ ├── check_env
│ │ │ ├── install
│ │ │ ├── remove
│ │ │ ├── reset
│ │ │ ├── run
│ │ │ ├── run_until_fails
│ │ │ ├── scripts/
│ │ │ │ ├── ema.py
│ │ │ │ ├── flash_leds.py
│ │ │ │ ├── trendc.py
│ │ │ │ └── write_out.py
│ │ │ ├── test
│ │ │ ├── test.config
│ │ │ └── verify_clean_pi.py
│ │ ├── memory_leak/
│ │ │ ├── config.sh
│ │ │ ├── scripts/
│ │ │ │ ├── log_analyzer
│ │ │ │ ├── reset
│ │ │ │ └── setup
│ │ │ ├── test_memcheck.sh
│ │ │ └── valgrind-python.supp
│ │ ├── plugins/
│ │ │ ├── README.rst
│ │ │ └── south/
│ │ │ └── fledge-south-testcard/
│ │ │ ├── .gitignore
│ │ │ ├── CMakeLists.txt
│ │ │ ├── Description
│ │ │ ├── FindFledge.cmake
│ │ │ ├── LICENSE
│ │ │ ├── Package
│ │ │ ├── README.rst
│ │ │ ├── VERSION
│ │ │ ├── fledge.version
│ │ │ ├── mkversion
│ │ │ ├── plugin.cpp
│ │ │ └── requirements.sh
│ │ └── python/
│ │ ├── README.rst
│ │ ├── api/
│ │ │ ├── control_service/
│ │ │ │ ├── test_entrypoint.py
│ │ │ │ └── test_pipeline.py
│ │ │ ├── test_alerts.py
│ │ │ ├── test_audit.py
│ │ │ ├── test_authentication.py
│ │ │ ├── test_browser_assets.py
│ │ │ ├── test_common.py
│ │ │ ├── test_configuration.py
│ │ │ ├── test_endpoints_with_different_user_types.py
│ │ │ ├── test_notification.py
│ │ │ ├── test_passwords.py
│ │ │ ├── test_plugin_discovery.py
│ │ │ ├── test_service.py
│ │ │ └── test_statistics.py
│ │ ├── conftest.py
│ │ ├── data/
│ │ │ ├── dummyplugin.py
│ │ │ ├── notify35.py
│ │ │ ├── vibration.csv
│ │ │ └── wind-data.csv
│ │ ├── e2e/
│ │ │ ├── docs/
│ │ │ │ ├── test_e2e_coap_PI.rst
│ │ │ │ ├── test_e2e_csv_PI.rst
│ │ │ │ ├── test_e2e_csv_multi_filter_pi.rst
│ │ │ │ ├── test_e2e_expr_pi.rst
│ │ │ │ ├── test_e2e_filter_fft_threshold.rst
│ │ │ │ ├── test_e2e_kafka.rst
│ │ │ │ ├── test_e2e_modbus_c_pi.rst
│ │ │ │ ├── test_e2e_notification_service_with_plugins.rst
│ │ │ │ └── test_south_service_tuning.rst
│ │ │ ├── test_e2e_coap_OCS.py
│ │ │ ├── test_e2e_coap_PI.py
│ │ │ ├── test_e2e_csv_PI.py
│ │ │ ├── test_e2e_csv_multi_filter_pi.py
│ │ │ ├── test_e2e_expr_pi.py
│ │ │ ├── test_e2e_filter_fft_threshold.py
│ │ │ ├── test_e2e_kafka.py
│ │ │ ├── test_e2e_modbus_c_pi.py
│ │ │ ├── test_e2e_modbus_c_rtu_pi.py
│ │ │ ├── test_e2e_notification_service_with_plugins.py
│ │ │ ├── test_e2e_pi_scaleset.py
│ │ │ ├── test_e2e_vary_asset_http_pi.py
│ │ │ └── test_south_service_tuning.py
│ │ ├── fledge/
│ │ │ └── plugins/
│ │ │ ├── filter/
│ │ │ │ └── imageblock/
│ │ │ │ ├── README.rst
│ │ │ │ ├── __init__.py
│ │ │ │ └── imageblock.py
│ │ │ └── south/
│ │ │ └── imagetest/
│ │ │ ├── __init__.py
│ │ │ ├── imagetest.py
│ │ │ └── readme.rst
│ │ ├── helpers/
│ │ │ └── utils.py
│ │ ├── iprpc/
│ │ │ ├── README.rst
│ │ │ └── test_iprpc.py
│ │ ├── packages/
│ │ │ ├── README.rst
│ │ │ ├── data/
│ │ │ │ ├── package_list.json
│ │ │ │ ├── readings35.py
│ │ │ │ └── set_id.py
│ │ │ ├── docs/
│ │ │ │ ├── test_authentication.rst
│ │ │ │ ├── test_filters.rst
│ │ │ │ ├── test_multiple_assets.rst
│ │ │ │ ├── test_north_azure.rst
│ │ │ │ ├── test_north_pi_webapi_nw_throttle.rst
│ │ │ │ ├── test_omf_naming_scheme.rst
│ │ │ │ ├── test_omf_north_service.rst
│ │ │ │ ├── test_pi_webapi.rst
│ │ │ │ ├── test_pi_webapi_linked_data_type.rst
│ │ │ │ ├── test_rule_data_availability.rst
│ │ │ │ └── test_statistics_history_notification_rule.rst
│ │ │ ├── network_impairment.py
│ │ │ ├── test_authentication.py
│ │ │ ├── test_available_and_install_api.py
│ │ │ ├── test_eds.py
│ │ │ ├── test_filters.py
│ │ │ ├── test_lab.py
│ │ │ ├── test_multiple_assets.py
│ │ │ ├── test_north_azure.py
│ │ │ ├── test_north_pi_webapi_nw_throttle.py
│ │ │ ├── test_omf_naming_scheme.py
│ │ │ ├── test_omf_north_service.py
│ │ │ ├── test_opcua.py
│ │ │ ├── test_pi_webapi.py
│ │ │ ├── test_pi_webapi_linked_data_type.py
│ │ │ ├── test_rule_data_availability.py
│ │ │ └── test_statistics_history_notification_rule.py
│ │ ├── pair/
│ │ │ ├── docs/
│ │ │ │ ├── test_c_north_service_pair.rst
│ │ │ │ ├── test_e2e_fledge_pair.rst
│ │ │ │ └── test_python_north_service_pair.rst
│ │ │ ├── test_c_north_service_pair.py
│ │ │ ├── test_e2e_fledge_pair.py
│ │ │ └── test_python_north_service_pair.py
│ │ ├── plugin_and_service.py
│ │ ├── plugins/
│ │ │ ├── dummy/
│ │ │ │ └── iprpc/
│ │ │ │ ├── filter/
│ │ │ │ │ ├── numpy_filter/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── numpy_filter.py
│ │ │ │ │ └── numpy_iprpc_filter/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── np_server.py
│ │ │ │ │ └── numpy_iprpc_filter.py
│ │ │ │ └── south/
│ │ │ │ └── numpy_south/
│ │ │ │ ├── __init__.py
│ │ │ │ └── numpy_south.py
│ │ │ ├── notificationDelivery/
│ │ │ │ └── send/
│ │ │ │ └── send.py
│ │ │ └── notificationRule/
│ │ │ └── numpy_image/
│ │ │ └── numpy_image.py
│ │ ├── pytest.ini
│ │ ├── rpi/
│ │ │ └── test_e2e_rpi_ephat.py
│ │ ├── scripts/
│ │ │ ├── install_c_plugin
│ │ │ ├── install_c_service
│ │ │ ├── install_python_plugin
│ │ │ ├── package/
│ │ │ │ ├── remove
│ │ │ │ ├── reset
│ │ │ │ └── setup
│ │ │ └── reset_plugins
│ │ └── smoke/
│ │ └── test_smoke.py
│ └── unit/
│ ├── C/
│ │ ├── CMakeLists.txt
│ │ ├── CodeCoverage.cmake
│ │ ├── README.rst
│ │ ├── cmake_pg/
│ │ │ ├── CMakeLists.txt
│ │ │ └── CheckRhPg.cmake
│ │ ├── cmake_sqlite/
│ │ │ ├── CMakeLists.txt
│ │ │ └── Findsqlite3.cmake
│ │ ├── cmake_sqliteM/
│ │ │ ├── CMakeLists.txt
│ │ │ └── Findsqlite3.cmake
│ │ ├── cmake_sqlitelb/
│ │ │ ├── CMakeLists.txt
│ │ │ └── Findsqlite3.cmake
│ │ ├── common/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── main.cpp
│ │ │ ├── test_JSONPath.cpp
│ │ │ ├── test_circular_buffer.cpp
│ │ │ ├── test_config_category.cpp
│ │ │ ├── test_createDirectory.cpp
│ │ │ ├── test_default_config_category.cpp
│ │ │ ├── test_expression.cpp
│ │ │ ├── test_imageencode.cpp
│ │ │ ├── test_insert_value.cpp
│ │ │ ├── test_json_reading.cpp
│ │ │ ├── test_json_utils.cpp
│ │ │ ├── test_log_interceptor.cpp
│ │ │ ├── test_purge_result.cpp
│ │ │ ├── test_python_reading.cpp
│ │ │ ├── test_python_reading_set.cpp
│ │ │ ├── test_python_readingnumpy.cpp
│ │ │ ├── test_query.cpp
│ │ │ ├── test_reading.cpp
│ │ │ ├── test_reading_array.cpp
│ │ │ ├── test_reading_set.cpp
│ │ │ ├── test_readingset_merge.cpp
│ │ │ ├── test_resultset.cpp
│ │ │ ├── test_service_record.cpp
│ │ │ └── test_string_utils.cpp
│ │ ├── plugins/
│ │ │ ├── common/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── main.cpp
│ │ │ │ ├── test_omf_translation.cpp
│ │ │ │ └── test_omf_translation_piwebapi.cpp
│ │ │ └── storage/
│ │ │ ├── common/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── README.rst
│ │ │ │ └── tests.cpp
│ │ │ ├── postgres/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── CheckRhPg.cmake
│ │ │ │ ├── README.rst
│ │ │ │ └── tests.cpp
│ │ │ ├── sqlite/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── README.rst
│ │ │ │ └── tests.cpp
│ │ │ ├── sqlitelb/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── README.rst
│ │ │ │ └── tests.cpp
│ │ │ └── sqlitememory/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── README.rst
│ │ │ └── sqlmem_tests.cpp
│ │ ├── requirements.sh
│ │ ├── scripts/
│ │ │ └── RunAllTests.sh
│ │ └── services/
│ │ ├── core/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── main.cpp
│ │ │ ├── reading_set_copy.cpp
│ │ │ └── test_service_regsitery.cpp
│ │ └── storage/
│ │ ├── postgres/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── DeleteRows.json
│ │ │ ├── GetTable.json
│ │ │ ├── PostStorageSchema.json
│ │ │ ├── PostTable.json
│ │ │ ├── PutQuery.json
│ │ │ ├── PutTable.json
│ │ │ ├── PutTableExpression.json
│ │ │ ├── README.rst
│ │ │ ├── expected_ETC_UTC/
│ │ │ │ ├── 1
│ │ │ │ ├── 10
│ │ │ │ ├── 100
│ │ │ │ ├── 101
│ │ │ │ ├── 102
│ │ │ │ ├── 103
│ │ │ │ ├── 104
│ │ │ │ ├── 105
│ │ │ │ ├── 106
│ │ │ │ ├── 107
│ │ │ │ ├── 108
│ │ │ │ ├── 109
│ │ │ │ ├── 11
│ │ │ │ ├── 110
│ │ │ │ ├── 111
│ │ │ │ ├── 112
│ │ │ │ ├── 113
│ │ │ │ ├── 115
│ │ │ │ ├── 116
│ │ │ │ ├── 12
│ │ │ │ ├── 13
│ │ │ │ ├── 14
│ │ │ │ ├── 15
│ │ │ │ ├── 16
│ │ │ │ ├── 17
│ │ │ │ ├── 18
│ │ │ │ ├── 19
│ │ │ │ ├── 2
│ │ │ │ ├── 20
│ │ │ │ ├── 21
│ │ │ │ ├── 22
│ │ │ │ ├── 23
│ │ │ │ ├── 24
│ │ │ │ ├── 25
│ │ │ │ ├── 26
│ │ │ │ ├── 27
│ │ │ │ ├── 28
│ │ │ │ ├── 29
│ │ │ │ ├── 3
│ │ │ │ ├── 30
│ │ │ │ ├── 31
│ │ │ │ ├── 32
│ │ │ │ ├── 33
│ │ │ │ ├── 34
│ │ │ │ ├── 35
│ │ │ │ ├── 37
│ │ │ │ ├── 38
│ │ │ │ ├── 39
│ │ │ │ ├── 4
│ │ │ │ ├── 40
│ │ │ │ ├── 41
│ │ │ │ ├── 42
│ │ │ │ ├── 43
│ │ │ │ ├── 44
│ │ │ │ ├── 45
│ │ │ │ ├── 46
│ │ │ │ ├── 47
│ │ │ │ ├── 48
│ │ │ │ ├── 49
│ │ │ │ ├── 5
│ │ │ │ ├── 50
│ │ │ │ ├── 51
│ │ │ │ ├── 52
│ │ │ │ ├── 53
│ │ │ │ ├── 54
│ │ │ │ ├── 55
│ │ │ │ ├── 56
│ │ │ │ ├── 57
│ │ │ │ ├── 58
│ │ │ │ ├── 59
│ │ │ │ ├── 6
│ │ │ │ ├── 60
│ │ │ │ ├── 61
│ │ │ │ ├── 62
│ │ │ │ ├── 63
│ │ │ │ ├── 64
│ │ │ │ ├── 65
│ │ │ │ ├── 66
│ │ │ │ ├── 67
│ │ │ │ ├── 68
│ │ │ │ ├── 69
│ │ │ │ ├── 7
│ │ │ │ ├── 70
│ │ │ │ ├── 71
│ │ │ │ ├── 72
│ │ │ │ ├── 73
│ │ │ │ ├── 74
│ │ │ │ ├── 75
│ │ │ │ ├── 76
│ │ │ │ ├── 77
│ │ │ │ ├── 78
│ │ │ │ ├── 79
│ │ │ │ ├── 8
│ │ │ │ ├── 80
│ │ │ │ ├── 81
│ │ │ │ ├── 82
│ │ │ │ ├── 83
│ │ │ │ ├── 84
│ │ │ │ ├── 85
│ │ │ │ ├── 86
│ │ │ │ ├── 87
│ │ │ │ ├── 88
│ │ │ │ ├── 89
│ │ │ │ ├── 9
│ │ │ │ ├── 90
│ │ │ │ ├── 91
│ │ │ │ ├── 92
│ │ │ │ ├── 93
│ │ │ │ ├── 94
│ │ │ │ ├── 95
│ │ │ │ ├── 96
│ │ │ │ ├── 97
│ │ │ │ ├── 98
│ │ │ │ └── 99
│ │ │ ├── expected_ETC_UTC_PG12/
│ │ │ │ ├── 1
│ │ │ │ ├── 10
│ │ │ │ ├── 100
│ │ │ │ ├── 101
│ │ │ │ ├── 102
│ │ │ │ ├── 103
│ │ │ │ ├── 104
│ │ │ │ ├── 105
│ │ │ │ ├── 106
│ │ │ │ ├── 107
│ │ │ │ ├── 108
│ │ │ │ ├── 109
│ │ │ │ ├── 11
│ │ │ │ ├── 110
│ │ │ │ ├── 111
│ │ │ │ ├── 112
│ │ │ │ ├── 113
│ │ │ │ ├── 115
│ │ │ │ ├── 116
│ │ │ │ ├── 12
│ │ │ │ ├── 13
│ │ │ │ ├── 14
│ │ │ │ ├── 15
│ │ │ │ ├── 16
│ │ │ │ ├── 17
│ │ │ │ ├── 18
│ │ │ │ ├── 19
│ │ │ │ ├── 2
│ │ │ │ ├── 20
│ │ │ │ ├── 21
│ │ │ │ ├── 22
│ │ │ │ ├── 23
│ │ │ │ ├── 24
│ │ │ │ ├── 25
│ │ │ │ ├── 26
│ │ │ │ ├── 27
│ │ │ │ ├── 28
│ │ │ │ ├── 29
│ │ │ │ ├── 3
│ │ │ │ ├── 30
│ │ │ │ ├── 31
│ │ │ │ ├── 32
│ │ │ │ ├── 33
│ │ │ │ ├── 34
│ │ │ │ ├── 35
│ │ │ │ ├── 37
│ │ │ │ ├── 38
│ │ │ │ ├── 39
│ │ │ │ ├── 4
│ │ │ │ ├── 40
│ │ │ │ ├── 41
│ │ │ │ ├── 42
│ │ │ │ ├── 43
│ │ │ │ ├── 44
│ │ │ │ ├── 45
│ │ │ │ ├── 46
│ │ │ │ ├── 47
│ │ │ │ ├── 48
│ │ │ │ ├── 49
│ │ │ │ ├── 5
│ │ │ │ ├── 50
│ │ │ │ ├── 51
│ │ │ │ ├── 52
│ │ │ │ ├── 53
│ │ │ │ ├── 54
│ │ │ │ ├── 55
│ │ │ │ ├── 56
│ │ │ │ ├── 57
│ │ │ │ ├── 58
│ │ │ │ ├── 59
│ │ │ │ ├── 6
│ │ │ │ ├── 60
│ │ │ │ ├── 61
│ │ │ │ ├── 62
│ │ │ │ ├── 63
│ │ │ │ ├── 64
│ │ │ │ ├── 65
│ │ │ │ ├── 66
│ │ │ │ ├── 67
│ │ │ │ ├── 68
│ │ │ │ ├── 69
│ │ │ │ ├── 7
│ │ │ │ ├── 70
│ │ │ │ ├── 71
│ │ │ │ ├── 72
│ │ │ │ ├── 73
│ │ │ │ ├── 74
│ │ │ │ ├── 75
│ │ │ │ ├── 76
│ │ │ │ ├── 77
│ │ │ │ ├── 78
│ │ │ │ ├── 79
│ │ │ │ ├── 8
│ │ │ │ ├── 80
│ │ │ │ ├── 81
│ │ │ │ ├── 82
│ │ │ │ ├── 83
│ │ │ │ ├── 84
│ │ │ │ ├── 85
│ │ │ │ ├── 86
│ │ │ │ ├── 87
│ │ │ │ ├── 88
│ │ │ │ ├── 89
│ │ │ │ ├── 9
│ │ │ │ ├── 90
│ │ │ │ ├── 91
│ │ │ │ ├── 92
│ │ │ │ ├── 93
│ │ │ │ ├── 94
│ │ │ │ ├── 95
│ │ │ │ ├── 96
│ │ │ │ ├── 97
│ │ │ │ ├── 98
│ │ │ │ └── 99
│ │ │ ├── expected_EUROPE_ROME/
│ │ │ │ ├── 1
│ │ │ │ ├── 10
│ │ │ │ ├── 100
│ │ │ │ ├── 101
│ │ │ │ ├── 102
│ │ │ │ ├── 103
│ │ │ │ ├── 104
│ │ │ │ ├── 105
│ │ │ │ ├── 106
│ │ │ │ ├── 107
│ │ │ │ ├── 108
│ │ │ │ ├── 109
│ │ │ │ ├── 11
│ │ │ │ ├── 110
│ │ │ │ ├── 111
│ │ │ │ ├── 112
│ │ │ │ ├── 113
│ │ │ │ ├── 115
│ │ │ │ ├── 116
│ │ │ │ ├── 12
│ │ │ │ ├── 13
│ │ │ │ ├── 14
│ │ │ │ ├── 15
│ │ │ │ ├── 16
│ │ │ │ ├── 17
│ │ │ │ ├── 18
│ │ │ │ ├── 19
│ │ │ │ ├── 2
│ │ │ │ ├── 20
│ │ │ │ ├── 21
│ │ │ │ ├── 22
│ │ │ │ ├── 23
│ │ │ │ ├── 24
│ │ │ │ ├── 25
│ │ │ │ ├── 26
│ │ │ │ ├── 27
│ │ │ │ ├── 28
│ │ │ │ ├── 29
│ │ │ │ ├── 3
│ │ │ │ ├── 30
│ │ │ │ ├── 31
│ │ │ │ ├── 32
│ │ │ │ ├── 33
│ │ │ │ ├── 34
│ │ │ │ ├── 35
│ │ │ │ ├── 37
│ │ │ │ ├── 38
│ │ │ │ ├── 39
│ │ │ │ ├── 4
│ │ │ │ ├── 40
│ │ │ │ ├── 41
│ │ │ │ ├── 42
│ │ │ │ ├── 43
│ │ │ │ ├── 44
│ │ │ │ ├── 45
│ │ │ │ ├── 46
│ │ │ │ ├── 47
│ │ │ │ ├── 48
│ │ │ │ ├── 49
│ │ │ │ ├── 5
│ │ │ │ ├── 50
│ │ │ │ ├── 51
│ │ │ │ ├── 52
│ │ │ │ ├── 53
│ │ │ │ ├── 54
│ │ │ │ ├── 55
│ │ │ │ ├── 56
│ │ │ │ ├── 57
│ │ │ │ ├── 58
│ │ │ │ ├── 59
│ │ │ │ ├── 6
│ │ │ │ ├── 60
│ │ │ │ ├── 61
│ │ │ │ ├── 62
│ │ │ │ ├── 63
│ │ │ │ ├── 64
│ │ │ │ ├── 65
│ │ │ │ ├── 66
│ │ │ │ ├── 67
│ │ │ │ ├── 68
│ │ │ │ ├── 69
│ │ │ │ ├── 7
│ │ │ │ ├── 70
│ │ │ │ ├── 71
│ │ │ │ ├── 72
│ │ │ │ ├── 73
│ │ │ │ ├── 74
│ │ │ │ ├── 75
│ │ │ │ ├── 76
│ │ │ │ ├── 77
│ │ │ │ ├── 78
│ │ │ │ ├── 79
│ │ │ │ ├── 8
│ │ │ │ ├── 80
│ │ │ │ ├── 81
│ │ │ │ ├── 82
│ │ │ │ ├── 83
│ │ │ │ ├── 84
│ │ │ │ ├── 85
│ │ │ │ ├── 86
│ │ │ │ ├── 87
│ │ │ │ ├── 88
│ │ │ │ ├── 89
│ │ │ │ ├── 9
│ │ │ │ ├── 90
│ │ │ │ ├── 91
│ │ │ │ ├── 92
│ │ │ │ ├── 93
│ │ │ │ ├── 94
│ │ │ │ ├── 95
│ │ │ │ ├── 96
│ │ │ │ ├── 97
│ │ │ │ ├── 98
│ │ │ │ └── 99
│ │ │ ├── expected_EUROPE_ROME_PG12/
│ │ │ │ ├── 1
│ │ │ │ ├── 10
│ │ │ │ ├── 100
│ │ │ │ ├── 101
│ │ │ │ ├── 102
│ │ │ │ ├── 103
│ │ │ │ ├── 104
│ │ │ │ ├── 105
│ │ │ │ ├── 106
│ │ │ │ ├── 107
│ │ │ │ ├── 108
│ │ │ │ ├── 109
│ │ │ │ ├── 11
│ │ │ │ ├── 110
│ │ │ │ ├── 111
│ │ │ │ ├── 112
│ │ │ │ ├── 113
│ │ │ │ ├── 115
│ │ │ │ ├── 116
│ │ │ │ ├── 12
│ │ │ │ ├── 13
│ │ │ │ ├── 14
│ │ │ │ ├── 15
│ │ │ │ ├── 16
│ │ │ │ ├── 17
│ │ │ │ ├── 18
│ │ │ │ ├── 19
│ │ │ │ ├── 2
│ │ │ │ ├── 20
│ │ │ │ ├── 21
│ │ │ │ ├── 22
│ │ │ │ ├── 23
│ │ │ │ ├── 24
│ │ │ │ ├── 25
│ │ │ │ ├── 26
│ │ │ │ ├── 27
│ │ │ │ ├── 28
│ │ │ │ ├── 29
│ │ │ │ ├── 3
│ │ │ │ ├── 30
│ │ │ │ ├── 31
│ │ │ │ ├── 32
│ │ │ │ ├── 33
│ │ │ │ ├── 34
│ │ │ │ ├── 35
│ │ │ │ ├── 37
│ │ │ │ ├── 38
│ │ │ │ ├── 39
│ │ │ │ ├── 4
│ │ │ │ ├── 40
│ │ │ │ ├── 41
│ │ │ │ ├── 42
│ │ │ │ ├── 43
│ │ │ │ ├── 44
│ │ │ │ ├── 45
│ │ │ │ ├── 46
│ │ │ │ ├── 47
│ │ │ │ ├── 48
│ │ │ │ ├── 49
│ │ │ │ ├── 5
│ │ │ │ ├── 50
│ │ │ │ ├── 51
│ │ │ │ ├── 52
│ │ │ │ ├── 53
│ │ │ │ ├── 54
│ │ │ │ ├── 55
│ │ │ │ ├── 56
│ │ │ │ ├── 57
│ │ │ │ ├── 58
│ │ │ │ ├── 59
│ │ │ │ ├── 6
│ │ │ │ ├── 60
│ │ │ │ ├── 61
│ │ │ │ ├── 62
│ │ │ │ ├── 63
│ │ │ │ ├── 64
│ │ │ │ ├── 65
│ │ │ │ ├── 66
│ │ │ │ ├── 67
│ │ │ │ ├── 68
│ │ │ │ ├── 69
│ │ │ │ ├── 7
│ │ │ │ ├── 70
│ │ │ │ ├── 71
│ │ │ │ ├── 72
│ │ │ │ ├── 73
│ │ │ │ ├── 74
│ │ │ │ ├── 75
│ │ │ │ ├── 76
│ │ │ │ ├── 77
│ │ │ │ ├── 78
│ │ │ │ ├── 79
│ │ │ │ ├── 8
│ │ │ │ ├── 80
│ │ │ │ ├── 81
│ │ │ │ ├── 82
│ │ │ │ ├── 83
│ │ │ │ ├── 84
│ │ │ │ ├── 85
│ │ │ │ ├── 86
│ │ │ │ ├── 87
│ │ │ │ ├── 88
│ │ │ │ ├── 89
│ │ │ │ ├── 9
│ │ │ │ ├── 90
│ │ │ │ ├── 91
│ │ │ │ ├── 92
│ │ │ │ ├── 93
│ │ │ │ ├── 94
│ │ │ │ ├── 95
│ │ │ │ ├── 96
│ │ │ │ ├── 97
│ │ │ │ ├── 98
│ │ │ │ └── 99
│ │ │ ├── makeReadings.sh
│ │ │ ├── payload1.json
│ │ │ ├── payload2.json
│ │ │ ├── payload3.json
│ │ │ ├── payload4.json
│ │ │ ├── payload5.json
│ │ │ ├── payload6.json
│ │ │ ├── payload7.json
│ │ │ ├── payload8.json
│ │ │ ├── payload9.json
│ │ │ ├── payloads/
│ │ │ │ ├── FOGL-983.json
│ │ │ │ ├── add_snapshot.json
│ │ │ │ ├── addnew.json
│ │ │ │ ├── asset.json
│ │ │ │ ├── bad_sort_1.json
│ │ │ │ ├── bad_sort_2.json
│ │ │ │ ├── bad_update.json
│ │ │ │ ├── badreadings.json
│ │ │ │ ├── count_assets.json
│ │ │ │ ├── delete.json
│ │ │ │ ├── fogl690-error.json
│ │ │ │ ├── fogl690-ok.json
│ │ │ │ ├── get-FOGL-983.json
│ │ │ │ ├── get_updated_complex_JSON.json
│ │ │ │ ├── group.json
│ │ │ │ ├── group_time.json
│ │ │ │ ├── insert.json
│ │ │ │ ├── insert2.json
│ │ │ │ ├── insert_bad.json
│ │ │ │ ├── insert_bad2.json
│ │ │ │ ├── limit.json
│ │ │ │ ├── limit_max_int.json
│ │ │ │ ├── msec_add_readings_user_ts.json
│ │ │ │ ├── msec_query_asset_aggmin.json
│ │ │ │ ├── msec_query_asset_aggminarray.json
│ │ │ │ ├── msec_query_asset_alias.json
│ │ │ │ ├── msec_query_asset_noalias.json
│ │ │ │ ├── msec_query_readings.json
│ │ │ │ ├── multi_and.json
│ │ │ │ ├── multi_mixed.json
│ │ │ │ ├── multi_or.json
│ │ │ │ ├── newer.json
│ │ │ │ ├── newerBad.json
│ │ │ │ ├── older.json
│ │ │ │ ├── put_function_in_JSON.json
│ │ │ │ ├── put_json_in_JSON.json
│ │ │ │ ├── query_readings.json
│ │ │ │ ├── query_readings_in.json
│ │ │ │ ├── query_readings_in_bad_values.json
│ │ │ │ ├── query_readings_not_in.json
│ │ │ │ ├── query_readings_timebucket.json
│ │ │ │ ├── query_readings_timebucket1.json
│ │ │ │ ├── query_readings_timebucket_bad.json
│ │ │ │ ├── query_timebucket_datapoints.json
│ │ │ │ ├── read_id_1xx.json
│ │ │ │ ├── reading_property.json
│ │ │ │ ├── reading_property_array.json
│ │ │ │ ├── reading_property_bad.json
│ │ │ │ ├── readings.json
│ │ │ │ ├── readings_timebucket.json
│ │ │ │ ├── skip.json
│ │ │ │ ├── skip_max_int.json
│ │ │ │ ├── sort.json
│ │ │ │ ├── sort2.json
│ │ │ │ ├── timezone.json
│ │ │ │ ├── timezone_bad.json
│ │ │ │ ├── update.json
│ │ │ │ ├── updateKey.json
│ │ │ │ ├── update_bad.json
│ │ │ │ ├── update_expression.json
│ │ │ │ ├── update_json.json
│ │ │ │ ├── update_json2.json
│ │ │ │ ├── where_avg.json
│ │ │ │ ├── where_bad_1.json
│ │ │ │ ├── where_bad_2.json
│ │ │ │ ├── where_bad_3.json
│ │ │ │ ├── where_bad_4.json
│ │ │ │ ├── where_bad_format1.json
│ │ │ │ ├── where_bad_format2.json
│ │ │ │ ├── where_count.json
│ │ │ │ ├── where_count_star.json
│ │ │ │ ├── where_distinct.json
│ │ │ │ ├── where_id_1.json
│ │ │ │ ├── where_id_1_r1.json
│ │ │ │ ├── where_id_1_r2.json
│ │ │ │ ├── where_id_1_r3.json
│ │ │ │ ├── where_id_2.json
│ │ │ │ ├── where_id_not_1.json
│ │ │ │ ├── where_in.json
│ │ │ │ ├── where_in_bad_values.json
│ │ │ │ ├── where_like.json
│ │ │ │ ├── where_max.json
│ │ │ │ ├── where_min.json
│ │ │ │ ├── where_multi_aggregatee.json
│ │ │ │ ├── where_not_in.json
│ │ │ │ ├── where_numeric_column.json
│ │ │ │ ├── where_sum.json
│ │ │ │ ├── where_test2_d1.json
│ │ │ │ ├── where_test2_d2.json
│ │ │ │ ├── where_test2_d3.json
│ │ │ │ ├── where_test2_d4.json
│ │ │ │ └── where_test2_d5.json
│ │ │ ├── plugins/
│ │ │ │ └── common/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── README.rst
│ │ │ │ └── tests.cpp
│ │ │ ├── storageSchemaTest.sh
│ │ │ ├── test1.sh
│ │ │ ├── test2.sh
│ │ │ ├── testCleanup.sh
│ │ │ ├── testRunner.sh
│ │ │ ├── testSetup.sh
│ │ │ ├── tests.cpp
│ │ │ └── testset
│ │ └── sqlite/
│ │ ├── README.rst
│ │ ├── expected_ETC_UTC/
│ │ │ ├── 1
│ │ │ ├── 10
│ │ │ ├── 100
│ │ │ ├── 101
│ │ │ ├── 102
│ │ │ ├── 103
│ │ │ ├── 104
│ │ │ ├── 105
│ │ │ ├── 106
│ │ │ ├── 107
│ │ │ ├── 108
│ │ │ ├── 109
│ │ │ ├── 11
│ │ │ ├── 110
│ │ │ ├── 111
│ │ │ ├── 112
│ │ │ ├── 113
│ │ │ ├── 114
│ │ │ ├── 115
│ │ │ ├── 116
│ │ │ ├── 117
│ │ │ ├── 118
│ │ │ ├── 119
│ │ │ ├── 12
│ │ │ ├── 120
│ │ │ ├── 121
│ │ │ ├── 122
│ │ │ ├── 123
│ │ │ ├── 124
│ │ │ ├── 125
│ │ │ ├── 126
│ │ │ ├── 127
│ │ │ ├── 128
│ │ │ ├── 13
│ │ │ ├── 14
│ │ │ ├── 15
│ │ │ ├── 16
│ │ │ ├── 17
│ │ │ ├── 18
│ │ │ ├── 19
│ │ │ ├── 2
│ │ │ ├── 20
│ │ │ ├── 21
│ │ │ ├── 22
│ │ │ ├── 23
│ │ │ ├── 24
│ │ │ ├── 25
│ │ │ ├── 26
│ │ │ ├── 27
│ │ │ ├── 28
│ │ │ ├── 29
│ │ │ ├── 3
│ │ │ ├── 30
│ │ │ ├── 31
│ │ │ ├── 32
│ │ │ ├── 33
│ │ │ ├── 34
│ │ │ ├── 35
│ │ │ ├── 37
│ │ │ ├── 38
│ │ │ ├── 39
│ │ │ ├── 4
│ │ │ ├── 40
│ │ │ ├── 41
│ │ │ ├── 42
│ │ │ ├── 43
│ │ │ ├── 44
│ │ │ ├── 45
│ │ │ ├── 46
│ │ │ ├── 47
│ │ │ ├── 48
│ │ │ ├── 49
│ │ │ ├── 5
│ │ │ ├── 50
│ │ │ ├── 51
│ │ │ ├── 52
│ │ │ ├── 53
│ │ │ ├── 54
│ │ │ ├── 55
│ │ │ ├── 56
│ │ │ ├── 57
│ │ │ ├── 58
│ │ │ ├── 59
│ │ │ ├── 6
│ │ │ ├── 60
│ │ │ ├── 61
│ │ │ ├── 62
│ │ │ ├── 63
│ │ │ ├── 64
│ │ │ ├── 65
│ │ │ ├── 66
│ │ │ ├── 67
│ │ │ ├── 68
│ │ │ ├── 69
│ │ │ ├── 7
│ │ │ ├── 70
│ │ │ ├── 71
│ │ │ ├── 72
│ │ │ ├── 73
│ │ │ ├── 74
│ │ │ ├── 75
│ │ │ ├── 76
│ │ │ ├── 77
│ │ │ ├── 78
│ │ │ ├── 79
│ │ │ ├── 8
│ │ │ ├── 80
│ │ │ ├── 81
│ │ │ ├── 82
│ │ │ ├── 83
│ │ │ ├── 84
│ │ │ ├── 85
│ │ │ ├── 86
│ │ │ ├── 87
│ │ │ ├── 88
│ │ │ ├── 89
│ │ │ ├── 9
│ │ │ ├── 90
│ │ │ ├── 91
│ │ │ ├── 92
│ │ │ ├── 93
│ │ │ ├── 94
│ │ │ ├── 95
│ │ │ ├── 96
│ │ │ ├── 97
│ │ │ ├── 98
│ │ │ └── 99
│ │ ├── expected_EUROPE_ROME/
│ │ │ ├── 1
│ │ │ ├── 10
│ │ │ ├── 100
│ │ │ ├── 101
│ │ │ ├── 102
│ │ │ ├── 103
│ │ │ ├── 104
│ │ │ ├── 105
│ │ │ ├── 106
│ │ │ ├── 107
│ │ │ ├── 108
│ │ │ ├── 109
│ │ │ ├── 11
│ │ │ ├── 110
│ │ │ ├── 111
│ │ │ ├── 112
│ │ │ ├── 113
│ │ │ ├── 114
│ │ │ ├── 115
│ │ │ ├── 116
│ │ │ ├── 117
│ │ │ ├── 118
│ │ │ ├── 119
│ │ │ ├── 12
│ │ │ ├── 120
│ │ │ ├── 121
│ │ │ ├── 122
│ │ │ ├── 123
│ │ │ ├── 124
│ │ │ ├── 125
│ │ │ ├── 126
│ │ │ ├── 127
│ │ │ ├── 128
│ │ │ ├── 13
│ │ │ ├── 14
│ │ │ ├── 15
│ │ │ ├── 16
│ │ │ ├── 17
│ │ │ ├── 18
│ │ │ ├── 19
│ │ │ ├── 2
│ │ │ ├── 20
│ │ │ ├── 21
│ │ │ ├── 22
│ │ │ ├── 23
│ │ │ ├── 24
│ │ │ ├── 25
│ │ │ ├── 26
│ │ │ ├── 27
│ │ │ ├── 28
│ │ │ ├── 29
│ │ │ ├── 3
│ │ │ ├── 30
│ │ │ ├── 31
│ │ │ ├── 32
│ │ │ ├── 33
│ │ │ ├── 34
│ │ │ ├── 35
│ │ │ ├── 37
│ │ │ ├── 38
│ │ │ ├── 39
│ │ │ ├── 4
│ │ │ ├── 40
│ │ │ ├── 41
│ │ │ ├── 42
│ │ │ ├── 43
│ │ │ ├── 44
│ │ │ ├── 45
│ │ │ ├── 46
│ │ │ ├── 47
│ │ │ ├── 48
│ │ │ ├── 49
│ │ │ ├── 5
│ │ │ ├── 50
│ │ │ ├── 51
│ │ │ ├── 52
│ │ │ ├── 53
│ │ │ ├── 54
│ │ │ ├── 55
│ │ │ ├── 56
│ │ │ ├── 57
│ │ │ ├── 58
│ │ │ ├── 59
│ │ │ ├── 6
│ │ │ ├── 60
│ │ │ ├── 61
│ │ │ ├── 62
│ │ │ ├── 63
│ │ │ ├── 64
│ │ │ ├── 65
│ │ │ ├── 66
│ │ │ ├── 67
│ │ │ ├── 68
│ │ │ ├── 69
│ │ │ ├── 7
│ │ │ ├── 70
│ │ │ ├── 71
│ │ │ ├── 72
│ │ │ ├── 73
│ │ │ ├── 74
│ │ │ ├── 75
│ │ │ ├── 76
│ │ │ ├── 77
│ │ │ ├── 78
│ │ │ ├── 79
│ │ │ ├── 8
│ │ │ ├── 80
│ │ │ ├── 81
│ │ │ ├── 82
│ │ │ ├── 83
│ │ │ ├── 84
│ │ │ ├── 85
│ │ │ ├── 86
│ │ │ ├── 87
│ │ │ ├── 88
│ │ │ ├── 89
│ │ │ ├── 9
│ │ │ ├── 90
│ │ │ ├── 91
│ │ │ ├── 92
│ │ │ ├── 93
│ │ │ ├── 94
│ │ │ ├── 95
│ │ │ ├── 96
│ │ │ ├── 97
│ │ │ ├── 98
│ │ │ └── 99
│ │ ├── makeReadings.sh
│ │ ├── payloads/
│ │ │ ├── FOGL-983.json
│ │ │ ├── add_readings_now.json
│ │ │ ├── add_snapshot.json
│ │ │ ├── addnew.json
│ │ │ ├── asset.json
│ │ │ ├── bad_sort_1.json
│ │ │ ├── bad_sort_2.json
│ │ │ ├── bad_update.json
│ │ │ ├── badreadings.json
│ │ │ ├── count_assets.json
│ │ │ ├── delete.json
│ │ │ ├── fogl690-error.json
│ │ │ ├── fogl690-ok.json
│ │ │ ├── get-FOGL-983.json
│ │ │ ├── group.json
│ │ │ ├── group_time.json
│ │ │ ├── insert.json
│ │ │ ├── insert2.json
│ │ │ ├── insert_1row.json
│ │ │ ├── insert_bad.json
│ │ │ ├── insert_bad2.json
│ │ │ ├── insert_multi_rows.json
│ │ │ ├── limit.json
│ │ │ ├── limit_max_int.json
│ │ │ ├── msec_add_readings_user_ts.json
│ │ │ ├── msec_query_asset_aggmin.json
│ │ │ ├── msec_query_asset_aggminarray.json
│ │ │ ├── msec_query_asset_alias.json
│ │ │ ├── msec_query_asset_noalias.json
│ │ │ ├── msec_query_readings.json
│ │ │ ├── multi_and.json
│ │ │ ├── multi_mixed.json
│ │ │ ├── multi_or.json
│ │ │ ├── newer.json
│ │ │ ├── newerBad.json
│ │ │ ├── older.json
│ │ │ ├── query_readings.json
│ │ │ ├── query_readings_in.json
│ │ │ ├── query_readings_in_bad_values.json
│ │ │ ├── query_readings_not_in.json
│ │ │ ├── query_readings_timebucket.json
│ │ │ ├── query_readings_timebucket1.json
│ │ │ ├── query_readings_timebucket_bad.json
│ │ │ ├── query_timebucket_datapoints.json
│ │ │ ├── read_id_1xx.json
│ │ │ ├── reading_property.json
│ │ │ ├── reading_property_array.json
│ │ │ ├── reading_property_bad.json
│ │ │ ├── readings.json
│ │ │ ├── readings_timebucket.json
│ │ │ ├── series_group_by_hours.json
│ │ │ ├── series_group_by_minutes.json
│ │ │ ├── series_seconds.json
│ │ │ ├── series_summary_seconds.json
│ │ │ ├── skip.json
│ │ │ ├── skip_max_int.json
│ │ │ ├── sort.json
│ │ │ ├── sort2.json
│ │ │ ├── timezone.json
│ │ │ ├── timezone_bad.json
│ │ │ ├── tz_all_insert.json
│ │ │ ├── tz_all_read_2.json
│ │ │ ├── tz_all_read_3.json
│ │ │ ├── tz_readings_insert.json
│ │ │ ├── tz_readings_read_2.json
│ │ │ ├── tz_readings_read_3.json
│ │ │ ├── tz_readings_read_4.json
│ │ │ ├── update.json
│ │ │ ├── updateKey.json
│ │ │ ├── update_bad.json
│ │ │ ├── update_expression.json
│ │ │ ├── update_json.json
│ │ │ ├── update_json2.json
│ │ │ ├── update_multi_rows.json
│ │ │ ├── updatenow.json
│ │ │ ├── where_avg.json
│ │ │ ├── where_bad_1.json
│ │ │ ├── where_bad_2.json
│ │ │ ├── where_bad_3.json
│ │ │ ├── where_bad_4.json
│ │ │ ├── where_bad_format1.json
│ │ │ ├── where_bad_format2.json
│ │ │ ├── where_count.json
│ │ │ ├── where_count_star.json
│ │ │ ├── where_distinct.json
│ │ │ ├── where_id_1.json
│ │ │ ├── where_id_1_r1.json
│ │ │ ├── where_id_1_r2.json
│ │ │ ├── where_id_1_r3.json
│ │ │ ├── where_id_2.json
│ │ │ ├── where_id_not_1.json
│ │ │ ├── where_in.json
│ │ │ ├── where_in_bad_values.json
│ │ │ ├── where_like.json
│ │ │ ├── where_max.json
│ │ │ ├── where_min.json
│ │ │ ├── where_multi_aggregatee.json
│ │ │ ├── where_not_in.json
│ │ │ ├── where_sum.json
│ │ │ ├── where_test2_d1.json
│ │ │ ├── where_test2_d2.json
│ │ │ ├── where_test2_d3.json
│ │ │ ├── where_test2_d4.json
│ │ │ └── where_test2_d5.json
│ │ ├── testCleanup.sh
│ │ ├── testRunner.sh
│ │ ├── testSetup.sh
│ │ └── testset
│ └── python/
│ ├── .coveragerc
│ ├── .pytest.ini
│ ├── README.rst
│ ├── __template__.py
│ └── fledge/
│ ├── common/
│ │ ├── configuration_manager_callback.py
│ │ ├── configuration_manager_callback_nonasync.py
│ │ ├── configuration_manager_callback_norun.py
│ │ ├── microservice_management_client/
│ │ │ └── test_microservice_management_client.py
│ │ ├── storage_client/
│ │ │ ├── data/
│ │ │ │ ├── payload_aggregate1.json
│ │ │ │ ├── payload_aggregate1_alias.json
│ │ │ │ ├── payload_aggregate2.json
│ │ │ │ ├── payload_aggregate2_alias.json
│ │ │ │ ├── payload_aggregate3.json
│ │ │ │ ├── payload_aggregate4.json
│ │ │ │ ├── payload_aggregate5.json
│ │ │ │ ├── payload_aggregate6.json
│ │ │ │ ├── payload_aggregate6_alias.json
│ │ │ │ ├── payload_aggregate7_alias.json
│ │ │ │ ├── payload_aggregate_all.json
│ │ │ │ ├── payload_aggregate_where.json
│ │ │ │ ├── payload_and_where1.json
│ │ │ │ ├── payload_and_where2.json
│ │ │ │ ├── payload_and_where_isnull.json
│ │ │ │ ├── payload_and_where_notnull.json
│ │ │ │ ├── payload_complex_select1.json
│ │ │ │ ├── payload_condition_in.json
│ │ │ │ ├── payload_condition_not_in.json
│ │ │ │ ├── payload_conditions1.json
│ │ │ │ ├── payload_conditions2.json
│ │ │ │ ├── payload_conditions3.json
│ │ │ │ ├── payload_conditions4.json
│ │ │ │ ├── payload_conditions5.json
│ │ │ │ ├── payload_conditions6.json
│ │ │ │ ├── payload_delete_where1.json
│ │ │ │ ├── payload_distinct.json
│ │ │ │ ├── payload_expr1.json
│ │ │ │ ├── payload_expr2.json
│ │ │ │ ├── payload_from1.json
│ │ │ │ ├── payload_from2.json
│ │ │ │ ├── payload_group_by1.json
│ │ │ │ ├── payload_group_by1_alias.json
│ │ │ │ ├── payload_group_by2.json
│ │ │ │ ├── payload_group_by2_alias.json
│ │ │ │ ├── payload_insert1.json
│ │ │ │ ├── payload_join_with_query.json
│ │ │ │ ├── payload_join_with_query_only_table_name.json
│ │ │ │ ├── payload_join_without_query.json
│ │ │ │ ├── payload_join_without_query_only_table_name.json
│ │ │ │ ├── payload_json_properties1.json
│ │ │ │ ├── payload_json_properties2.json
│ │ │ │ ├── payload_limit1.json
│ │ │ │ ├── payload_limit2.json
│ │ │ │ ├── payload_limit_offset1.json
│ │ │ │ ├── payload_limit_offset2.json
│ │ │ │ ├── payload_modifier_set_where.json
│ │ │ │ ├── payload_multiple_and_where_with_isnull.json
│ │ │ │ ├── payload_multiple_and_where_with_notnull.json
│ │ │ │ ├── payload_multiple_or_where_with_isnull.json
│ │ │ │ ├── payload_multiple_or_where_with_notnull.json
│ │ │ │ ├── payload_nested_join.json
│ │ │ │ ├── payload_newer_condition.json
│ │ │ │ ├── payload_offset1.json
│ │ │ │ ├── payload_offset2.json
│ │ │ │ ├── payload_older_condition.json
│ │ │ │ ├── payload_or_where1.json
│ │ │ │ ├── payload_or_where2.json
│ │ │ │ ├── payload_or_where_isnull.json
│ │ │ │ ├── payload_or_where_notnull.json
│ │ │ │ ├── payload_order_by1.json
│ │ │ │ ├── payload_order_by2.json
│ │ │ │ ├── payload_order_by3.json
│ │ │ │ ├── payload_select1.json
│ │ │ │ ├── payload_select1_alias.json
│ │ │ │ ├── payload_select2.json
│ │ │ │ ├── payload_select2_alias.json
│ │ │ │ ├── payload_select3_alias.json
│ │ │ │ ├── payload_select_alias_with_timezone.json
│ │ │ │ ├── payload_set1.json
│ │ │ │ ├── payload_timebucket1.json
│ │ │ │ ├── payload_timebucket2.json
│ │ │ │ ├── payload_timebucket3.json
│ │ │ │ ├── payload_timebucket4.json
│ │ │ │ ├── payload_update_set_where1.json
│ │ │ │ ├── payload_where_condition_isnull.json
│ │ │ │ └── payload_where_condition_notnull.json
│ │ │ ├── test_payload_builder.py
│ │ │ ├── test_sc_exceptions.py
│ │ │ ├── test_storage_client.py
│ │ │ └── test_utils.py
│ │ ├── test_alert_manager.py
│ │ ├── test_audit_logger.py
│ │ ├── test_common_utils.py
│ │ ├── test_configuration_cache.py
│ │ ├── test_configuration_manager.py
│ │ ├── test_configuration_validation_helpers.py
│ │ ├── test_logger.py
│ │ ├── test_plugin_discovery.py
│ │ ├── test_process.py
│ │ ├── test_service_record.py
│ │ ├── test_statistics.py
│ │ └── web/
│ │ ├── test_middleware.py
│ │ └── test_ssl_wrapper.py
│ ├── plugins/
│ │ ├── common/
│ │ │ └── test_plugins_common_utils.py
│ │ └── north/
│ │ └── common/
│ │ └── test_common.py
│ ├── services/
│ │ ├── common/
│ │ │ ├── microservice_management/
│ │ │ │ └── test_instance.py
│ │ │ ├── test_microservice.py
│ │ │ └── test_services_common_utils.py
│ │ └── core/
│ │ ├── api/
│ │ │ ├── certs/
│ │ │ │ ├── fledge.pem
│ │ │ │ ├── fledge.txt
│ │ │ │ ├── json/
│ │ │ │ │ └── test.json
│ │ │ │ └── pem/
│ │ │ │ └── fledge.pem
│ │ │ ├── control_service/
│ │ │ │ ├── test_acl_management.py
│ │ │ │ ├── test_entrypoint.py
│ │ │ │ ├── test_pipeline.py
│ │ │ │ └── test_script_management.py
│ │ │ ├── plugins/
│ │ │ │ ├── test_config_validator.py
│ │ │ │ ├── test_discovery.py
│ │ │ │ ├── test_install.py
│ │ │ │ ├── test_remove.py
│ │ │ │ └── test_update.py
│ │ │ ├── support/
│ │ │ │ └── .gitkeep
│ │ │ ├── test_alerts.py
│ │ │ ├── test_api_utils.py
│ │ │ ├── test_asset_tracker_api.py
│ │ │ ├── test_audit.py
│ │ │ ├── test_auth_mandatory.py
│ │ │ ├── test_auth_optional.py
│ │ │ ├── test_backup_restore.py
│ │ │ ├── test_browser_assets.py
│ │ │ ├── test_certificate_store.py
│ │ │ ├── test_common_ping.py
│ │ │ ├── test_configuration.py
│ │ │ ├── test_filters.py
│ │ │ ├── test_notification.py
│ │ │ ├── test_package_log.py
│ │ │ ├── test_scheduler_api.py
│ │ │ ├── test_service.py
│ │ │ ├── test_statistics_api.py
│ │ │ ├── test_support.py
│ │ │ └── test_task.py
│ │ ├── asset_tracker/
│ │ │ └── test_asset_tracker.py
│ │ ├── interest_registry/
│ │ │ ├── test_change_callback.py
│ │ │ └── test_interest_registry.py
│ │ ├── scheduler/
│ │ │ ├── test_scheduler.py
│ │ │ ├── test_scheduler_entities.py
│ │ │ └── test_scheduler_exceptions.py
│ │ ├── service_registry/
│ │ │ ├── test_exceptions.py
│ │ │ ├── test_monitor.py
│ │ │ └── test_service_registry.py
│ │ ├── test_connect.py
│ │ ├── test_main.py
│ │ ├── test_server.py
│ │ └── test_user_model.py
│ └── tasks/
│ ├── purge/
│ │ ├── test_purge.py
│ │ └── test_purge_main.py
│ └── statistics/
│ ├── test_statistics_history.py
│ └── test_statistics_main.py
└── tests-manual/
├── C/
│ └── services/
│ └── core/
│ ├── CMakeLists.txt
│ ├── README
│ ├── core_server.cpp
│ ├── expected/
│ │ ├── 1
│ │ ├── 10
│ │ ├── 11
│ │ ├── 12
│ │ ├── 13
│ │ ├── 14
│ │ ├── 15
│ │ ├── 16
│ │ ├── 17
│ │ ├── 18
│ │ ├── 19
│ │ ├── 2
│ │ ├── 20
│ │ ├── 21
│ │ ├── 22
│ │ ├── 23
│ │ ├── 3
│ │ ├── 4
│ │ ├── 5
│ │ ├── 6
│ │ ├── 7
│ │ ├── 8
│ │ └── 9
│ ├── main.cpp
│ ├── payloads/
│ │ ├── add_child_categories.json
│ │ ├── create_category.json
│ │ ├── create_category_a.json
│ │ ├── create_category_b.json
│ │ ├── create_category_update_b.json
│ │ ├── create_category_with_values.json
│ │ └── setvalue.json
│ ├── testRunner.sh
│ ├── testSetup.sh
│ ├── test_configuration_manager.cpp
│ └── testset
└── debugger/
├── .debugrc
├── README.rst
├── attach
├── buffer
├── commands
├── debug
├── detach
├── isolate
├── replay
├── resumeIngest
├── setBuffer
├── state
├── step
├── store
└── suspendIngest
================================================
FILE CONTENTS
================================================
================================================
FILE: .cursor/rules/C/core.mdc
================================================
---
description: Enforce C++11 coding standards for Fledge plugins.
globs: ["*.cpp", "*.h"]
alwaysApply: true
author: "Devki Nandan Ghildiyal"
---
## Fledge Project Context
- **Language Focus**: C++11
- **Primary Target**: South/North/Filter plugins
- **Tech Stack**
- **Languages** : C++11
- **Libraries** : GTest version 1.10.0, boost version 1.71
- **Database** : SQLite version 3, Postgres version 12
# Roles
## Senior Architect
- Focus: System design, scalability, security, module boundaries, third-party integrations
- Responsibilities:
- Review requirements and suggest if any gap is there in the requirement.
- Suggest design patterns, scalability strategies, and deployment models.
- Validate alignment with NFRs (non-functional requirements).
## Senior Developer
- Focus: Implementation, performance, maintainability, code quality
- Responsibilities:
- Review core logic, refactoring, and REST API contracts.
- Ensure idiomatic usage of C++11 standards.
- Enforce clean coding practices and SOLID principles.
- Fledge plugin API and extension points
- Filter pipeline structure and reading processing logic
- South/North plugin lifecycle
## Senior QA Engineer
- Focus: Test coverage, edge cases, negative scenarios, automation
- Responsibilities:
- Review requirements and prepare test plan
- Validate test plans and coverage.
- Suggest boundary tests, failure modes, stress scenarios.
- Generate unit tests using GTest version 1.10.0
- Review unit test structure.
You are playing **three roles** while reviewing, commenting, or helping with with deep knowledge of Fledge:
1. **Senior Architect** – Guide the system and module design.
2. **Senior Developer** – Evaluate the code quality and implementation.
3. **Senior QA Engineer** – Think from a test and validation standpoint.
Respond with comments or suggestions **clearly labeled** by the role, e.g.:
- `[Architect] Analyze requirements.md file to find out gaps in requirements if any.`
- `[Developer] Use range-based loops.`
- `[QA] Add unit tests for empty asset name.`
## Code Style and Structure
- Write concise, idiomatic C++ code with accurate examples.
- Follow modern C++11 conventions and best practices.
- Use object-oriented, procedural, or functional programming patterns as appropriate.
- Leverage STL and standard algorithms for collection operations.
- Use descriptive variable and method names (e.g., 'isUserSignedIn', 'calculateTotal').
- Structure files into headers (*.h) and implementation files (*.cpp) with logical separation of concerns.
## Naming Conventions
- Use PascalCase for class names.
- Use camelCase for variable names and methods.
- Use SCREAMING_SNAKE_CASE for constants and macros.
- Prefix member variables with an m_ (e.g., `m_userId`).
## C++ Features Usage
- Prefer modern C++11 features (e.g., auto, range-based loops).
- Use `constexpr` and `const` to optimize compile-time computations.
## Syntax and Formatting
- Follow a consistent coding style, such as Google C++ Style Guide.
- Place braces on the same line for control structures and methods.
- Use clear and consistent commenting practices.
## JSON Parsing
- Fledge uses RapidJSON for JSON parsing by using C++ '*.h' files from '../../../C/thirdparty/rapidjson/include/rapidjson/'
## REST API Support
- Fledge supports REST API by using C++ files from '../../../C/thirdparty/Simple-Web-Server'
## Error Handling and Validation
- Use exceptions for error handling (e.g., `std::runtime_error`, `std::invalid_argument`).
- Use RAII for resource management to avoid memory leaks.
- Validate inputs at function boundaries.
- Log errors using a logging class logger.h from '../../../C/common/include/logger.h'
## Performance Optimization
- Avoid unnecessary heap allocations; prefer stack-based objects where possible.
- Use `std::move` to enable move semantics and avoid copies.
- Optimize loops with algorithms from `<algorithm>` (e.g., `std::sort`, `std::for_each`).
- Profile and optimize critical sections with tools like Valgrind.
## Key Conventions
- Do not use smart pointers.
- Avoid global variables; use singletons sparingly.
- Use `enum class` for strongly typed enumerations.
- Separate interface from implementation in classes.
- Use templates and metaprogramming judiciously for generic solutions.
## Testing
- Write unit tests using frameworks like Google Test (GTest version 1.10.0).
- Mock dependencies with libraries like Google Mock.
- Implement integration tests for system components.
## Security
- Use secure coding practices to avoid vulnerabilities (e.g., buffer overflows, dangling pointers).
- Prefer `std::array` or `std::vector` over raw arrays.
- Avoid C-style casts; use `static_cast`, `dynamic_cast`, or `reinterpret_cast` when necessary.
- Enforce const-correctness in functions and member variables.
## Documentation
- Write clear comments for classes, methods, and critical logic.
- Use Doxygen for generating API documentation.
- Document assumptions, constraints, and expected behavior of code. All public classes and methods must include Doxygen comments specifying assumptions, constraints, and expected input/output.
Follow the official ISO C++ standards and guidelines for best practices in modern C++11 development.
## C++ south plugin development
- Use 'plugins/south.mdc'
## C++ north plugin development
- use 'plugins/north.mdc'
## C++ Filter plugin development
- use 'plugins/filter.mdc'
## Log Levels
Fledge support 5 levels of logging, which can be considered in descending order of severity; fatal, error, warning, info and debug. Each of these has a defined use and a targeted audience. By default only the 3 most severe levels of log will be written and presented to the user.
| Log Level | Intended Audience | Usage |
| :---- | :---- | :---- |
| fatal | End-user | This is the most severe error level and is reserved for situations whereby the service that raises them can not continue. It is not for transient failures. |
| error | End-user | Errors should be used when a transient issue prevents the service continuing in the short term, but may be recovered without the service restarting. |
| warning | End-user | A warning message should be used if the user needs to be aware of some reduction in service or non-fatal issue that does not stop the flow of data. |
| info | Code/Pipeline Developer | Informational messages should be used to give the user or developer more information as to the progress of a process or task, but does not impact the result of that task. It can be considered more as a progress tracking aid. |
| debug | Code Developer | Debug messages are reserved for the code developers working on a plugin or core features of the Fledge services. |
# Message Content Fog Logs
- All log entries should be written to be human readable and standalone from the code that raises them. The reader of the log message should not need to have access to the source code in order to understand a log message. They should not include internal code references or variable names, but rather be descriptive regarding any variables printed in the log.
- Log messages should not contain source file names, line numbers or function names as these have little to no meaning to the intended audience for the majority of log messages These also take up valuable space that can be better used to give a more in-depth description of the issue.
- Not only are the lengths of messages limited in syslog, but special characters such as new lines and carriage returns are mapped to hash codes and hence do not format correctly. Messages should not include such characters and should be simple strings.
================================================
FILE: .cursor/rules/C/plugins/filter.mdc
================================================
---
description: C++ Filter Plugin Architecture.
globs: ["*.cpp", "*.h"]
alwaysApply: true
author: "Devki Nandan Ghildiyal"
---
## Filter Plugin
- Filter plugin provides a mechanism to alter data as it flows from sensor to Fledge, or from Fledge to outside.
## General plugin guidelines
- General guidelines to write a Fledge plugin is at '../../../docs/plugin_developers_guide/02_writing_plugins.rst' file
## South plugin Guidelines
- Specific guidelines to write a north plugin is at '../../../docs/plugin_developers_guide/06_filter_plugins.rst'
## Common support classes
- Information about common support classes used by plugin is at '../../../docs/plugin_developers_guide/035_CPP.rst'
## Mutex and Locking
- Thread Safety: The fledge filter plugin can receive data (ingest()) and configuration changes (reconfigure()) simultaneously from different threads
- Data Consistency: Prevents reading configuration while it's being modified
- RAII Pattern: std::lock_guard automatically unlocks when going out of scope, preventing deadlocks
- Following sample code demonstrates use of mutex and locks when doing ingestion
```
void ingest(std::vector<Reading *> *readings, std::vector<Reading *>& outReadings)
{
std::lock_guard<std::mutex> guard(m_configMutex);
IngestData(readings, outReadings);
readings->clear();
}
```
- Following sample code demonstrates use of mutex and locks when doing configuration changes
```
void reconfigure(const std::string& conf)
{
std::lock_guard<std::mutex> guard(m_configMutex);
setConfig(conf);
handleConfig(m_config);
}
```
## Implementation details of plugin
- South plugin fetches data from sensors or external sources and store in Fledge
- Common C++ classes used in Fledge framework are at following location '../../../C/common/include' and '../../../C/common/'
- C++ class to handle reading in Fledge is at '../../../C/common/include/reading.h'
- C++ class to handle datapoint in Fledge is at '../../../C/common/include/datapoint.h'
- C++ class to handle logging in Fledge is at '../../../C/common/include/logger.h'
- C++ plugin must have a 'plugin.cpp' file
- 'plugin.cpp' file must have plugin configuration and
- Implementation of requirement of plugin is kept into a separate header and class implementation file which is used by 'plugin.cpp' file
- Every plugin has 'docs' and 'tests' directory
- 'plugin.cpp' must define plugin of the configuration
## Fledge plugin configuration
Every Fledge plugin has a default configuration represented by a JSON.
Following example demonstrates minimial configurtion for every plugin. configuration JSON for each plugin must have an elments called "plugin"
```
const char *default_config = QUOTE({
"plugin" : {
"description" : "My example plugin in C++",
"type" : "string",
"default" : "MyPlugin",
"readonly" : "true"
}
});
```
- constant default_config is a string that contains the JSON configuration document.
- QUOTE macro is used to manage JSON document easily
- Configuation JSON documment will have multiple elements for each configuration item.
- Fledge plugin supports following types
| Type | Description |
|:-----|:------------|
|integer|An integer numeric value. The minimum and maximum properties may be used to control the limits of the values assigned to an integer.|
|float|A floating point numeric item. The minimum and maximum properties may be used to control the limits of the values assigned to a float.|
|string|An alpha-numeric array of characters that may contain any printable characters. The length property can be used to constrain the maximum length of the string.|
|password|It is same as string type. User interfaces do not show this in plain text.|
|boolean|A boolean value that can be assigned the values true or false.|
|enumeration|The item can be assigned one of a fixed set of values. These values are defined in the options property of the item.|
|list|A list of items, the items can be of type string, integer, float, enumeration or object. The type of the items within the list must all be the same, and this is defined via the items property of the list. A limit on the maximum number of entries allowed in the list can be enforced by use of the listSize property.|
|kvlist|A key value pair list. The key is a string value always but the value of the item in the list may be of type string, enumeration, float, integer or object. The type of the values in the kvlist is defined by the items property of the configuration item. A limit on the maximum number of entries allowed in the list can be enforced by use of the listSize property.|
|object|A complex configuration type with multiple elements that may be used within list and kvlist items only, it is not possible to have object type items outside of a list. Object type configuration items have a set of properties defined, each of which is itself a configuration item.|
## Example for integer type
Sample configuration item "register"
```
"register" : {
"description" : "The register number to read",
"displayName" : "Register",
"type" : "integer",
"default" : "0",
"order" : "1"
}
```
## Example for integer type
Sample configuration item "temperature"
```
"temperature" : {
"description" : "Temperate of PLC",
"displayName" : "PLC Temperature",
"type" : "float",
"default" : "0",
"order" : "2"
}
```
## Example for string type
Sample configuration item "asset"
```
"asset" : {
"description" : "The name of the asset the plugin will produce",
"displayName" : "Asset Name",
"type" : "string",
"default" : "MyAsset",
"order" : "3"
}
```
## Example of password type
Sample configuration item "db_password"
```
"db_password" : {
"description" : "Password of the database",
"displayName" : "Database Password",
"type" : "boolean",
"default" : "MyAsset",
"order" : "4"
}
```
## Example of boolean type
Sample configuration item "apply_scaling"
```
"apply_scaling": {
"description": "Option to apply scaling",
"displayName": "Use Scaling"
"type": "boolean",
"default": "true",
"order" : "5"
}
```
## Example of enumeration type
Sample configuration item "authentication"
```
"authentication": {
"description": "Server Authentication",
"displayName": "Authentication",
"type": "enumeration",
"options": [
"mandatory",
"optional"
],
"default": "optional",
"order" : "6"
}
```
## Example of list type
Sample configuration item "tags"
```
"tags" : {
"description" : "A set of tag names on which to operate",
"displayName" : "Labels",
"type" : "list",
"items" : "string",
"default" : "[ \"speed\", \"temperature\", \"voltage\" ]",
"order" : "7"
}
```
## Example of kvlist type
Sample configuration item "expressions"
```
"expressions" : {
"description" : "A set of expressions used to evaluate and label data",
"displayName" : "Labels",
"type" : "kvlist",
"items" : "string",
"default" : "{\"idle\" : \"speed == 0\"}",
"order" : "8"
}
```
## Example of object type
Sample configuration item "map"
```
"map": {
"description": "A list of datapoints to read and PLC register definitions",
"type": "list",
"items" : "object",
"default": "[ { \"datapoint\" : \"speed\", \"register\" : \"10\", \"width\" : \"1\", \"type\" : \"integer\"} ]",
"order" : "3",
"displayName" : "PLC Map",
"properties" : {
"datapoint" : {
"description" : "The name of the datapoint to create for the map entry",
"displayName" : "Datapoint",
"type" : "string",
"default" : "datapoint"
},
"register" : {
"description" : "The register number to read",
"displayName" : "Register",
"type" : "integer",
"default" : "0"
},
"width" : {
"description" : "Number of registers to read",
"displayName" : "Width",
"type" : "integer",
"maximum" : "4",
"default" : "1"
},
"type" : {
"description" : "The data type to read",
"displayName" : "Data Type",
"type" : "enumeration",
"options" : [ "integer","float", "boolean" ],
"default" : "integer"
}
}
}
```
## Supported Poperties by configuration items in configuration JSON document
|Property|Description|
|:-----|:------------|
|default|The default value for the configuration item. This is always expressed as a string regardless of the type of the configuration item.|
|deprecated|A boolean flag to indicate that this item is no longer used and will be removed in a future release.|
|description|A description of the configuration item used in the user interface to give more details of the item. Commonly used as a mouse over help prompt.|
|displayName|The string to use in the user interface when presenting the configuration item. Generally a more user friendly form of the item name. Item names are referenced within the code.|
|items|The type of the items in a list or kvlist configuration item.|
|length|The maximum length of the string value of the item.|
|listSize|The maximum number of entries allowed in a list or kvlist item.|
|mandatory|A boolean flag to indicate that this item can not be left blank.|
|maximum|The maximum value for a numeric configuration item.|
|minimum|The minimum value for a numeric configuration item.|
|options|Only used for enumeration type elements. This is a JSON array of string that contains the options in the enumeration.|
|order|Used in the user interface to give an indication of how high up in the dialogue to place this item.|
|group|Used to group related items together. The main use of this is within the GUI which will turn each group into a tab in the creation and edit screens.|
|readonly|A boolean property that can be used to include items that can not be altered by the API.|
|rule|A validation rule that will be run against the value. This must evaluate to true for the new value to be accepted by the API|
|type|The type of the configuration item. The list of types supported are; integer, float, string, password, enumeration, boolean, list, kvlist, JSON, URL, IPV4, IPV6, script, code, X509 certificate and northTask.|
|validity|An expression used to determine if the configuration item is valid. Used in the UI to gray out one value based on the value of others.|
|value|The current value of the configuration item. This is not included when defining a set of default configuration in, for example, a plugin.|
|properties|A set of items that are used in list and kvlist type items to create a list of groups of configuration items.|
|keyName|A display name to be used for entry and display of key in the key-value list type, with item being an object.|
|keyDescription|A description of key value in the key-value list type, with item being an object.|
|permissions|An array of user roles that are allowed to update this configuration item. If not given then the configuration item can be updated by any user. If the permissions property is included in a configuration item the array must have at least one entry.|
================================================
FILE: .cursor/rules/C/plugins/north.mdc
================================================
---
description: C++ North Plugin Architecture.
globs: ["*.cpp", "*.h"]
alwaysApply: true
author: "Devki Nandan Ghildiyal"
---
## North Plugin
- North plugin extracts data stored into the Fledge and sends it out side to Fledge.
- North plugin can send data to a server, a service in the cloud, or other Fledge instance.
## General plugin guidelines
- General guidelines to write a Fledge plugin is at '../../../docs/plugin_developers_guide/02_writing_plugins.rst' file
## South plugin Guidelines
- Specific guidelines to write a north plugin is at '../../../docs/plugin_developers_guide/04_north_plugins.rst'
## Persisting Data
- Persistence feature can be implemented in the plugin to persist state between the execution of plugin.
- Guidelines to implement persistance feature is at '../../../docs/plugin_developers_guide/02_persisting_data.rst'
## Common support classes
- Information about common support classes used by plugin is at '../../../docs/plugin_developers_guide/035_CPP.rst'
## Mutex and Locking
- Thread Safety: The fledge north plugin can send data (send()) and configuration changes (reconfigure()) simultaneously from different threads
- Data Consistency: Prevents reading configuration while it's being modified
- RAII Pattern: std::lock_guard automatically unlocks when going out of scope, preventing deadlocks
- Following sample code demonstrates use of mutex and locks when sending data
```
void send(std::vector<Reading *> *readings, std::vector<Reading *>& outReadings)
{
std::lock_guard<std::mutex> guard(m_configMutex);
sendData(readings, outReadings);
readings->clear();
}
```
- Following sample code demonstrates use of mutex and locks when doing configuration changes
```
void reconfigure(const std::string& conf)
{
std::lock_guard<std::mutex> guard(m_configMutex);
setConfig(conf);
handleConfig(m_config);
}
```
## Implementation details of plugin
- South plugin fetches data from sensors or external sources and store in Fledge
- Common C++ classes used in Fledge framework are at following location '../../../C/common/include' and '../../../C/common/'
- C++ class to handle reading in Fledge is at '../../../C/common/include/reading.h'
- C++ class to handle datapoint in Fledge is at '../../../C/common/include/datapoint.h'
- C++ class to handle logging in Fledge is at '../../../C/common/include/logger.h'
- C++ plugin must have a 'plugin.cpp' file
- 'plugin.cpp' file must have plugin configuration and
- Implementation of requirement of plugin is kept into a separate header and class implementation file which is used by 'plugin.cpp' file
- Every plugin has 'docs' and 'tests' directory
- 'plugin.cpp' must define plugin of the configuration
## Fledge plugin configuration
Every Fledge plugin has a default configuration represented by a JSON.
Following example demonstrates minimial configurtion for every plugin. configuration JSON for each plugin must have an elments called "plugin"
```
const char *default_config = QUOTE({
"plugin" : {
"description" : "My example plugin in C++",
"type" : "string",
"default" : "MyPlugin",
"readonly" : "true"
}
});
```
- constant default_config is a string that contains the JSON configuration document.
- QUOTE macro is used to manage JSON document easily
- Configuation JSON documment will have multiple elements for each configuration item.
- Fledge plugin supports following types
| Type | Description |
|:-----|:------------|
|integer|An integer numeric value. The minimum and maximum properties may be used to control the limits of the values assigned to an integer.|
|float|A floating point numeric item. The minimum and maximum properties may be used to control the limits of the values assigned to a float.|
|string|An alpha-numeric array of characters that may contain any printable characters. The length property can be used to constrain the maximum length of the string.|
|password|It is same as string type. User interfaces do not show this in plain text.|
|boolean|A boolean value that can be assigned the values true or false.|
|enumeration|The item can be assigned one of a fixed set of values. These values are defined in the options property of the item.|
|list|A list of items, the items can be of type string, integer, float, enumeration or object. The type of the items within the list must all be the same, and this is defined via the items property of the list. A limit on the maximum number of entries allowed in the list can be enforced by use of the listSize property.|
|kvlist|A key value pair list. The key is a string value always but the value of the item in the list may be of type string, enumeration, float, integer or object. The type of the values in the kvlist is defined by the items property of the configuration item. A limit on the maximum number of entries allowed in the list can be enforced by use of the listSize property.|
|object|A complex configuration type with multiple elements that may be used within list and kvlist items only, it is not possible to have object type items outside of a list. Object type configuration items have a set of properties defined, each of which is itself a configuration item.|
## Example for integer type
Sample configuration item "register"
```
"register" : {
"description" : "The register number to read",
"displayName" : "Register",
"type" : "integer",
"default" : "0",
"order" : "1"
}
```
## Example for integer type
Sample configuration item "temperature"
```
"temperature" : {
"description" : "Temperate of PLC",
"displayName" : "PLC Temperature",
"type" : "float",
"default" : "0",
"order" : "2"
}
```
## Example for string type
Sample configuration item "asset"
```
"asset" : {
"description" : "The name of the asset the plugin will produce",
"displayName" : "Asset Name",
"type" : "string",
"default" : "MyAsset",
"order" : "3"
}
```
## Example of password type
Sample configuration item "db_password"
```
"db_password" : {
"description" : "Password of the database",
"displayName" : "Database Password",
"type" : "boolean",
"default" : "MyAsset",
"order" : "4"
}
```
## Example of boolean type
Sample configuration item "apply_scaling"
```
"apply_scaling": {
"description": "Option to apply scaling",
"displayName": "Use Scaling"
"type": "boolean",
"default": "true",
"order" : "5"
}
```
## Example of enumeration type
Sample configuration item "authentication"
```
"authentication": {
"description": "Server Authentication",
"displayName": "Authentication",
"type": "enumeration",
"options": [
"mandatory",
"optional"
],
"default": "optional",
"order" : "6"
}
```
## Example of list type
Sample configuration item "tags"
```
"tags" : {
"description" : "A set of tag names on which to operate",
"displayName" : "Labels",
"type" : "list",
"items" : "string",
"default" : "[ \"speed\", \"temperature\", \"voltage\" ]",
"order" : "7"
}
```
## Example of kvlist type
Sample configuration item "expressions"
```
"expressions" : {
"description" : "A set of expressions used to evaluate and label data",
"displayName" : "Labels",
"type" : "kvlist",
"items" : "string",
"default" : "{\"idle\" : \"speed == 0\"}",
"order" : "8"
}
```
## Example of object type
Sample configuration item "map"
```
"map": {
"description": "A list of datapoints to read and PLC register definitions",
"type": "list",
"items" : "object",
"default": "[ { \"datapoint\" : \"speed\", \"register\" : \"10\", \"width\" : \"1\", \"type\" : \"integer\"} ]",
"order" : "3",
"displayName" : "PLC Map",
"properties" : {
"datapoint" : {
"description" : "The name of the datapoint to create for the map entry",
"displayName" : "Datapoint",
"type" : "string",
"default" : "datapoint"
},
"register" : {
"description" : "The register number to read",
"displayName" : "Register",
"type" : "integer",
"default" : "0"
},
"width" : {
"description" : "Number of registers to read",
"displayName" : "Width",
"type" : "integer",
"maximum" : "4",
"default" : "1"
},
"type" : {
"description" : "The data type to read",
"displayName" : "Data Type",
"type" : "enumeration",
"options" : [ "integer","float", "boolean" ],
"default" : "integer"
}
}
}
```
## Supported Poperties by configuration items in configuration JSON document
|Property|Description|
|:-----|:------------|
|default|The default value for the configuration item. This is always expressed as a string regardless of the type of the configuration item.|
|deprecated|A boolean flag to indicate that this item is no longer used and will be removed in a future release.|
|description|A description of the configuration item used in the user interface to give more details of the item. Commonly used as a mouse over help prompt.|
|displayName|The string to use in the user interface when presenting the configuration item. Generally a more user friendly form of the item name. Item names are referenced within the code.|
|items|The type of the items in a list or kvlist configuration item.|
|length|The maximum length of the string value of the item.|
|listSize|The maximum number of entries allowed in a list or kvlist item.|
|mandatory|A boolean flag to indicate that this item can not be left blank.|
|maximum|The maximum value for a numeric configuration item.|
|minimum|The minimum value for a numeric configuration item.|
|options|Only used for enumeration type elements. This is a JSON array of string that contains the options in the enumeration.|
|order|Used in the user interface to give an indication of how high up in the dialogue to place this item.|
|group|Used to group related items together. The main use of this is within the GUI which will turn each group into a tab in the creation and edit screens.|
|readonly|A boolean property that can be used to include items that can not be altered by the API.|
|rule|A validation rule that will be run against the value. This must evaluate to true for the new value to be accepted by the API|
|type|The type of the configuration item. The list of types supported are; integer, float, string, password, enumeration, boolean, list, kvlist, JSON, URL, IPV4, IPV6, script, code, X509 certificate and northTask.|
|validity|An expression used to determine if the configuration item is valid. Used in the UI to gray out one value based on the value of others.|
|value|The current value of the configuration item. This is not included when defining a set of default configuration in, for example, a plugin.|
|properties|A set of items that are used in list and kvlist type items to create a list of groups of configuration items.|
|keyName|A display name to be used for entry and display of key in the key-value list type, with item being an object.|
|keyDescription|A description of key value in the key-value list type, with item being an object.|
|permissions|An array of user roles that are allowed to update this configuration item. If not given then the configuration item can be updated by any user. If the permissions property is included in a configuration item the array must have at least one entry.|
================================================
FILE: .cursor/rules/C/plugins/south.mdc
================================================
---
description: C++ South Plugin Architecture.
globs: ["*.cpp", "*.h"]
alwaysApply: true
author: "Devki Nandan Ghildiyal"
---
## South Plugin
- South plugin are of two types poll plugin and asyc plugin
- Poll type plugin calls plugin_poll method at the defined interval to collect data from sensor.
- Asych type plugin use some incoming event from device or callback mechanism
- SP_ASYNC flag is used to support async feature
- Plugin interface version 1.0.0 is used to fetch single reading
- Plugin interface version 2.0.0 is used to fetch multiple readings
- South plugin can be used to extract controls (Set Point Control) on the underlying device to which it is connected
- SP_CONTROL Flag is used to support Set Point Control feature
## General plugin guidelines
- General guidelines to write a Fledge plugin is at '../../../docs/plugin_developers_guide/02_writing_plugins.rst' file
## South plugin Guidelines
- Specific guidelines to write a south plugin is at '../../../docs/plugin_developers_guide/03_south_C_plugins.rst'
## Persisting Data
- Persistence feature can be implemented in the plugin to persist state between the execution of plugin.
- SP_PERSIST_DATA flag is used to support persist data feature
- Guidelines to implement persistance feature is at '../../../docs/plugin_developers_guide/02_persisting_data.rst'
## Common support classes
- Information about common support classes used by plugin is at '../../../docs/plugin_developers_guide/035_CPP.rst'
## Mutex and Locking
- Thread Safety: The fledge south plugin can receive data (ingest()) and configuration changes (reconfigure()) simultaneously from different threads
- Data Consistency: Prevents reading configuration while it's being modified
- RAII Pattern: std::lock_guard automatically unlocks when going out of scope, preventing deadlocks
- Following sample code demonstrates use of mutex and locks when doing ingestion
```
void ingest(std::vector<Reading *> *readings, std::vector<Reading *>& outReadings)
{
std::lock_guard<std::mutex> guard(m_configMutex);
IngestData(readings, outReadings);
readings->clear();
}
```
- Following sample code demonstrates use of mutex and locks when doing configuration changes
```
void reconfigure(const std::string& conf)
{
std::lock_guard<std::mutex> guard(m_configMutex);
setConfig(conf);
handleConfig(m_config);
}
```
## Implementation details of plugin
- South plugin fetches data from sensors or external sources and store in Fledge
- Common C++ classes used in Fledge framework are at following location '../../../C/common/include' and '../../../C/common/'
- C++ class to handle reading in Fledge is at '../../../C/common/include/reading.h'
- C++ class to handle datapoint in Fledge is at '../../../C/common/include/datapoint.h'
- C++ class to handle logging in Fledge is at '../../../C/common/include/logger.h'
- C++ plugin must have a 'plugin.cpp' file
- 'plugin.cpp' file must have plugin configuration and
- Implementation of requirement of plugin is kept into a separate header and class implementation file which is used by 'plugin.cpp' file
- Every plugin has 'docs' and 'tests' directory
- 'plugin.cpp' must define plugin of the configuration
## Fledge plugin configuration
Every Fledge plugin has a default configuration represented by a JSON.
Following example demonstrates minimial configurtion for every plugin. configuration JSON for each plugin must have an elments called "plugin"
```
const char *default_config = QUOTE({
"plugin" : {
"description" : "My example plugin in C++",
"type" : "string",
"default" : "MyPlugin",
"readonly" : "true"
}
});
```
- constant default_config is a string that contains the JSON configuration document.
- QUOTE macro is used to manage JSON document easily
- Configuation JSON documment will have multiple elements for each configuration item.
- Fledge plugin supports following types
| Type | Description |
|:-----|:------------|
|integer|An integer numeric value. The minimum and maximum properties may be used to control the limits of the values assigned to an integer.|
|float|A floating point numeric item. The minimum and maximum properties may be used to control the limits of the values assigned to a float.|
|string|An alpha-numeric array of characters that may contain any printable characters. The length property can be used to constrain the maximum length of the string.|
|password|It is same as string type. User interfaces do not show this in plain text.|
|boolean|A boolean value that can be assigned the values true or false.|
|enumeration|The item can be assigned one of a fixed set of values. These values are defined in the options property of the item.|
|list|A list of items, the items can be of type string, integer, float, enumeration or object. The type of the items within the list must all be the same, and this is defined via the items property of the list. A limit on the maximum number of entries allowed in the list can be enforced by use of the listSize property.|
|kvlist|A key value pair list. The key is a string value always but the value of the item in the list may be of type string, enumeration, float, integer or object. The type of the values in the kvlist is defined by the items property of the configuration item. A limit on the maximum number of entries allowed in the list can be enforced by use of the listSize property.|
|object|A complex configuration type with multiple elements that may be used within list and kvlist items only, it is not possible to have object type items outside of a list. Object type configuration items have a set of properties defined, each of which is itself a configuration item.|
## Example for integer type
Sample configuration item "register"
```
"register" : {
"description" : "The register number to read",
"displayName" : "Register",
"type" : "integer",
"default" : "0",
"order" : "1"
}
```
## Example for integer type
Sample configuration item "temperature"
```
"temperature" : {
"description" : "Temperate of PLC",
"displayName" : "PLC Temperature",
"type" : "float",
"default" : "0",
"order" : "2"
}
```
## Example for string type
Sample configuration item "asset"
```
"asset" : {
"description" : "The name of the asset the plugin will produce",
"displayName" : "Asset Name",
"type" : "string",
"default" : "MyAsset",
"order" : "3"
}
```
## Example of password type
Sample configuration item "db_password"
```
"db_password" : {
"description" : "Password of the database",
"displayName" : "Database Password",
"type" : "boolean",
"default" : "MyAsset",
"order" : "4"
}
```
## Example of boolean type
Sample configuration item "apply_scaling"
```
"apply_scaling": {
"description": "Option to apply scaling",
"displayName": "Use Scaling"
"type": "boolean",
"default": "true",
"order" : "5"
}
```
## Example of enumeration type
Sample configuration item "authentication"
```
"authentication": {
"description": "Server Authentication",
"displayName": "Authentication",
"type": "enumeration",
"options": [
"mandatory",
"optional"
],
"default": "optional",
"order" : "6"
}
```
## Example of list type
Sample configuration item "tags"
```
"tags" : {
"description" : "A set of tag names on which to operate",
"displayName" : "Labels",
"type" : "list",
"items" : "string",
"default" : "[ \"speed\", \"temperature\", \"voltage\" ]",
"order" : "7"
}
```
## Example of kvlist type
Sample configuration item "expressions"
```
"expressions" : {
"description" : "A set of expressions used to evaluate and label data",
"displayName" : "Labels",
"type" : "kvlist",
"items" : "string",
"default" : "{\"idle\" : \"speed == 0\"}",
"order" : "8"
}
```
## Example of object type
Sample configuration item "map"
```
"map": {
"description": "A list of datapoints to read and PLC register definitions",
"type": "list",
"items" : "object",
"default": "[ { \"datapoint\" : \"speed\", \"register\" : \"10\", \"width\" : \"1\", \"type\" : \"integer\"} ]",
"order" : "3",
"displayName" : "PLC Map",
"properties" : {
"datapoint" : {
"description" : "The name of the datapoint to create for the map entry",
"displayName" : "Datapoint",
"type" : "string",
"default" : "datapoint"
},
"register" : {
"description" : "The register number to read",
"displayName" : "Register",
"type" : "integer",
"default" : "0"
},
"width" : {
"description" : "Number of registers to read",
"displayName" : "Width",
"type" : "integer",
"maximum" : "4",
"default" : "1"
},
"type" : {
"description" : "The data type to read",
"displayName" : "Data Type",
"type" : "enumeration",
"options" : [ "integer","float", "boolean" ],
"default" : "integer"
}
}
}
```
## Supported Poperties by configuration items in configuration JSON document
|Property|Description|
|:-----|:------------|
|default|The default value for the configuration item. This is always expressed as a string regardless of the type of the configuration item.|
|deprecated|A boolean flag to indicate that this item is no longer used and will be removed in a future release.|
|description|A description of the configuration item used in the user interface to give more details of the item. Commonly used as a mouse over help prompt.|
|displayName|The string to use in the user interface when presenting the configuration item. Generally a more user friendly form of the item name. Item names are referenced within the code.|
|items|The type of the items in a list or kvlist configuration item.|
|length|The maximum length of the string value of the item.|
|listSize|The maximum number of entries allowed in a list or kvlist item.|
|mandatory|A boolean flag to indicate that this item can not be left blank.|
|maximum|The maximum value for a numeric configuration item.|
|minimum|The minimum value for a numeric configuration item.|
|options|Only used for enumeration type elements. This is a JSON array of string that contains the options in the enumeration.|
|order|Used in the user interface to give an indication of how high up in the dialogue to place this item.|
|group|Used to group related items together. The main use of this is within the GUI which will turn each group into a tab in the creation and edit screens.|
|readonly|A boolean property that can be used to include items that can not be altered by the API.|
|rule|A validation rule that will be run against the value. This must evaluate to true for the new value to be accepted by the API|
|type|The type of the configuration item. The list of types supported are; integer, float, string, password, enumeration, boolean, list, kvlist, JSON, URL, IPV4, IPV6, script, code, X509 certificate and northTask.|
|validity|An expression used to determine if the configuration item is valid. Used in the UI to gray out one value based on the value of others.|
|value|The current value of the configuration item. This is not included when defining a set of default configuration in, for example, a plugin.|
|properties|A set of items that are used in list and kvlist type items to create a list of groups of configuration items.|
|keyName|A display name to be used for entry and display of key in the key-value list type, with item being an object.|
|keyDescription|A description of key value in the key-value list type, with item being an object.|
|permissions|An array of user roles that are allowed to update this configuration item. If not given then the configuration item can be updated by any user. If the permissions property is included in a configuration item the array must have at least one entry.|
================================================
FILE: .cursor/rules/README.md
================================================
# 🎯 How to Use Cursor Rules with AI Prompts
This guide explains how to effectively use the Fledge Cursor rules for Python development and documentation in your AI prompts and development workflow.
## 📁 Directory Structure
Rules are organized for Python development and documentation:
```
.cursor/rules/
├── C
│ ├── core.mdc # Core C++ Standards + + platform requirements
│ └── plugins
│ ├── filter.mdc # C++ filter plugin rules
│ ├── north.mdc # C++ north plugin rules
│ └── south.mdc # C++ south plugin rules
├── README.md # This usage guide
├── python/ # Python-specific rules (Python 3.8.10-3.12, Ubuntu LTS 20.04+, Raspberry Pi)
│ ├── core.mdc # Core Python standards + platform requirements
│ ├── api.mdc # REST API + web framework dependencies
│ ├── config.mdc # Configuration management + validation deps
│ └── quality.mdc # Dependencies, logging, performance + requirements.txt
├── tests/ # Testing-specific rules
│ └── python/ # Python testing rules
│ ├── unit.mdc # Unit testing rules - pytest, coverage, best practices
│ └── api.mdc # API integration testing rules - conftest fixtures, http.client patterns
└── docs.mdc # Documentation guidelines
```
## 📋 Available Rule Files
| Rule File | Purpose | Applies To |
|-----------|---------|------------|
| `@C/core` | Core C++ standards,| `*.h`, `*.cpp` |
| `@C/plugins/south` | C++ South Plugin| `*.h`, `*.cpp` |
| `@C/plugins/north` | C++ North Plugin| `*.h`, `*.cpp` |
| `@C/plugins/filter` | C++ Filter Plugin| `*.h`, `*.cpp` |
| `@python/core` | Core Python standards, naming, imports | `*.py`, `python/**/*` |
| `@python/api` | REST APIs, routes, middleware | API files, routes.py, web middleware |
| `@python/config` | Configuration system, data formats | Config files, configuration modules |
| `@python/quality` | Dependencies, logging, performance | Requirements files |
| `@tests/python/unit` | Unit testing with pytest | Unit test files, test configuration |
| `@tests/python/api` | API integration testing with http.client | API integration test files, conftest.py |
| `@docs` | Documentation writing | `docs/**/*`, `*.rst` |
## 🏗️ Shared Platform & Dependencies
All Python rules include consistent platform and dependency information:
### **Platform Requirements** (Built into all Python rules)
- **C++ Standard**: C++11
- **Python Versions**: 3.8.10 - 3.12 (inclusive)
- **Ubuntu**: LTS versions, 20.04 onwards (x86_64 & aarch64)
- **Raspberry Pi OS**: Bullseye and Bookworm (aarch64 & armv7l)
### **Dependencies Management** (Referenced in all Python rules)
- **[python/requirements.txt](python/requirements.txt)** - Runtime dependencies
- **[python/requirements-dev.txt](python/requirements-dev.txt)** - Development dependencies
- **[python/requirements-test.txt](python/requirements-test.txt)** - Testing dependencies
### **Automatic Context** (No need to repeat in prompts)
When you use any `@python/*` rule, the AI automatically knows:
```bash
# Instead of writing this every time:
"Create a Python function that works on Python 3.8.10-3.12, Ubuntu LTS 20.04+, Raspberry Pi, uses requirements.txt for dependencies..."
# You can simply write:
@python/core "Create a Python function"
# The AI already knows the platform and dependency constraints!
```
## 🔄 Automatic Rule Application
Cursor automatically applies rules based on the files you're working with:
```yaml
# Example: Working on Python files automatically applies python/core rules
python/fledge/services/core/server.py → @python/core rules active
# Working on API files applies both core and API rules
python/fledge/services/core/api/auth.py → @python/core + @python/api rules active
# Documentation files apply docs rules
docs/quick_start/installing.rst → @docs rules active
```
## 🎯 Explicit Rule References in Prompts
### Direct Rule Invocation
```
@python/core Can you help me write a function that follows Fledge Python standards?
@python/api I need to create a new REST endpoint for device management
@docs Help me write documentation for this new feature
```
### Multiple Rule References
```
@python/core @python/quality Help me refactor this code with proper error handling
@python/api @python/config Create an API endpoint for configuration management
@docs @python/api Document this REST API following both documentation and API standards
@python/core @tests/python/unit Create a service class with comprehensive unit tests
@tests/python/api @python/api Create API integration tests for new REST endpoints
```
## 💡 Context-Aware Prompts
### When Working on Python Files
```
# Cursor automatically knows to apply Python rules
"Create a new service class that handles sensor data processing"
# The AI will automatically follow:
- snake_case naming conventions
- Type hints and docstrings
- FLCoreLogger usage
- Async/await patterns
- Error handling standards
- Python 3.8.10-3.12 compatibility
```
### When Working on Documentation
```
# In docs/ directory, rules automatically apply
"Document this new plugin API"
# The AI will automatically:
- Use reStructuredText format
- Follow Sphinx conventions
- Avoid "Fledge" in headings where possible
- Include proper cross-references
- Use correct heading hierarchy
```
## 🛠️ Specific Rule-Based Requests
### Configuration Management
```
Using @python/config rules, create a configuration category for my new plugin with:
- String, integer, and boolean parameters
- Proper validation
- Default values wrapped in quotes
- Reserved category name checking
```
### API Development
```
Following @python/api rules, create a REST endpoint that:
- Handles role-based access through middleware
- Returns camelCase JSON responses
- Includes proper error handling
- Checks for route conflicts
- Uses FLCoreLogger for logging
```
### Unit Testing
```
Using @tests/python/unit rules, create unit tests that:
- Use pytest framework
- Include proper mocking with pytest-mock
- Test both success and failure cases
- Follow the test file naming conventions
- Include code coverage setup
```
### API integration Testing
```
Using @tests/python/api rules, create API integration tests that:
- Use http.client library exclusively (no requests)
- Leverage conftest.py fixtures like reset_and_start_fledge
- Test API endpoints with proper authentication
- Use fledge_url and storage_plugin fixtures
- Follow system test organization patterns
```
### Documentation
```
Following @docs rules, create documentation that:
- Uses reStructuredText format
- Includes proper Sphinx directives
- Avoids excessive "Fledge" branding
- Has correct heading hierarchy
- Includes cross-references to related docs
```
## 🔀 Advanced Rule Usage
### API Documentation
```
Using @docs rules, create documentation for this Python API (@python/api)
that includes proper Sphinx directives and avoids excessive Fledge branding.
```
### Complete Feature Development
```
I'm creating a new Fledge service that includes:
- Python backend (@python/core @python/api)
- Configuration management (@python/config)
- Unit testing (@tests/python/unit)
- API integration testing (@tests/python/api)
- Complete documentation (@docs)
```
## 🔍 Rule-Aware Code Reviews
```
Review this code against @python/core and @python/quality rules:
- Check naming conventions (snake_case vs camelCase)
- Verify proper logging usage (FLCoreLogger)
- Ensure type hints are present
- Validate error handling patterns
- Check Python version compatibility
Review this test code against @tests/python/unit rules:
- Validate pytest usage and fixture patterns
- Check mocking strategies and test isolation
- Ensure proper test organization and naming
- Verify code coverage approach
```
## 🚀 Platform-Specific Development
```
# Old way (verbose, repetitive):
Using @python/core rules, help me optimize this code for:
- Raspberry Pi ARM architecture (aarch64, armv7l)
- Python 3.8.10-3.12 compatibility
- Edge device memory constraints
- Ubuntu LTS 20.04+ deployment
# New way (automatic platform context):
@python/core Optimize this code for edge device performance
# The AI automatically knows:
# - Python 3.8.10-3.12 compatibility
# - Ubuntu LTS 20.04+ (x86_64 & aarch64)
# - Raspberry Pi OS (aarch64 & armv7l)
# - Edge device memory constraints
# - Requirements.txt dependency management
```
## 🐛 Troubleshooting with Rules
```
This code isn't following @python/api middleware patterns.
Help me fix the authentication and role validation.
This documentation doesn't follow @docs anti-branding guidelines.
Help me remove excessive "Fledge" references while maintaining clarity.
```
## 🔧 Pro Tips for Using Rules Effectively
### 1. Let Rules Work Automatically
- Just open files in the appropriate directories
- Cursor applies rules based on file patterns (globs)
- No need to explicitly mention rules for basic tasks
- Rules are automatically in context
### 2. Use Rule Names for Specific Guidance
- When you need specific standards applied
- When working across multiple technologies
- When you want to ensure compliance with particular guidelines
- When combining multiple rule sets
### 3. Combine Rules for Complex Tasks
- Use multiple @ references for cross-cutting concerns
- Leverage rule interactions (e.g., API + Config + Testing)
- Apply domain-specific and quality rules together
### 4. Rule-Based Learning
```
Explain the difference between @python/core naming conventions
and @python/api response formatting.
How do @python/config validation rules work with @python/api endpoints?
```
### 5. Validation Against Rules
```
Does this code follow @python/quality standards for:
- Dependencies management
- Logging practices
- Performance optimization
Does this testing code follow @tests/python/unit standards for:
- pytest usage and fixtures
- Mocking patterns
- Test coverage
- Unit testing best practices
Does this API test follow @tests/python/api standards for:
- http.client usage
- conftest.py fixture usage
- API testing patterns
Validate this documentation against @docs standards for:
- reStructuredText formatting
- Sphinx directives
- Cross-references
- Branding guidelines
```
## 📖 Rule-Specific Examples
### Python Core (@python/core)
```
Create a device manager class that:
- Uses snake_case naming
- Includes proper docstrings
- Has type hints for all methods
- Uses FLCoreLogger for logging
- Follows the server.py architectural pattern
```
### API Development (@python/api)
```
Create a REST endpoint for asset management that:
- Uses role-based middleware validation
- Returns camelCase JSON responses
- Handles route conflicts
- Includes proper error handling
- Uses async/await patterns
```
### Configuration (@python/config)
```
Design a configuration category that:
- Includes string, integer, boolean, and JSON types
- Has proper validation rules
- Uses quoted default values
- Avoids reserved category names
- Includes optional validation constraints
```
### Documentation (@docs)
```
Write API documentation that:
- Uses reStructuredText format
- Includes proper Sphinx directives
- Avoids excessive "Fledge" branding
- Has correct heading hierarchy
- Includes cross-references to related docs
```
### Unit Testing (@tests/python/unit)
```
Create comprehensive unit tests that:
- Use pytest with proper fixtures
- Mock external dependencies appropriately
- Achieve meaningful test coverage
- Follow unit testing best practices
- Test both success and failure scenarios
```
### API integration Testing (@tests/python/api)
```
Create API integration tests that:
- Use http.client library exclusively
- Leverage conftest.py fixtures for environment setup
- Test API endpoints with authentication flows
- Use reset_and_start_fledge for clean test environments
- Follow system test organization patterns
```
### Dependencies & Quality (@python/quality)
```
Manage dependencies and code quality:
- Use requirements.txt for dependency management
- Follow FLCoreLogger patterns for logging
- Optimize for edge device performance
- Ensure Python version compatibility
- Document dependency constraints
```
## 🎯 Best Practices Summary
1. **Trust Automatic Application**: Let Cursor apply rules based on file context
2. **Use @ References Explicitly**: When you need specific rule compliance
3. **Combine Rules Strategically**: For Python development with documentation
4. **Validate Against Rules**: Use rules for code review and quality checks
5. **Focus on Core Technologies**: Leverage Python and documentation rules together
The rules work best when you let them guide development naturally - they'll automatically apply standards and catch issues as you code!
================================================
FILE: .cursor/rules/docs.mdc
================================================
---
description: "Cursor AI rules for Fledge documentation - covers reStructuredText, Sphinx, file naming, and content guidelines"
globs:
- "docs/**/*"
- "*.rst"
alwaysApply: false
author: "Ashish Jabble"
---
# Documentation Directory Cursor Rules
## Overview
This file contains specific rules for working with documentation in the `/docs` directory of the Fledge project. These rules supplement the main project cursor rules and focus on documentation-specific patterns and conventions.
## Documentation Framework
- **Format**: reStructuredText (.rst) format exclusively
- **Build System**: Sphinx documentation generator
- **Theme**: sphinx_rtd_theme (Read the Docs theme)
- **Configuration**: All settings in `docs/conf.py`
## 🚫 "Fledge" Branding Guidelines - MINIMIZE USAGE
**CRITICAL RULE: Avoid "Fledge" in naming wherever possible**
### What to Avoid:
- ❌ Image files: `fledge_architecture.png`
- ❌ Directory names: `fledge_authentication/`
- ❌ File names: `fledge_configuration.rst`
- ❌ Headings: "Fledge Authentication Setup"
- ❌ Repetitive content: "Fledge does this... Fledge provides that..."
### What to Use Instead:
- ✅ Image files: `architecture_overview.png`, `auth_flow.png`
- ✅ Directory names: `authentication/`, `configuration/`, `monitoring/`
- ✅ File names: `authentication.rst`, `configuration.rst`
- ✅ Headings: "Authentication Setup", "Configuration Guide"
- ✅ Content alternatives: "the platform", "the system", "this feature"
### When "Fledge" IS Appropriate:
- Main title pages and introductory content
- External references and comparisons
- Installation package names
- API endpoint references where it's part of the actual name
## File Organization
### Directory Structure
- `/docs/` - Main documentation root
- `/docs/_static/` - Static assets (CSS, images that aren't content)
- `/docs/_templates/` - Custom Sphinx templates
- `/docs/images/` - Documentation images and screenshots
- `/docs/quick_start/` - Getting started guides
- `/docs/plugin_developers_guide/` - Plugin development documentation
- `/docs/rest_api_guide/` - REST API documentation
- `/docs/building_fledge/` - Build and installation guides
- `/docs/monitoring/` - System monitoring documentation
- `/docs/fledge-rule-DataAvailability/` - Built-in Data Availability rule plugin docs
- `/docs/fledge-rule-Threshold/` - Built-in Threshold rule plugin docs
- `/docs/fledge-north-OMF.rst` - Built-in OMF north plugin documentation
- `/docs/keywords/` - Plugin categorization keywords and mappings
- `/docs/fledge_plugins.rst` - Master plugin list with conditional hyperlinks
**DIRECTORY NAMING GUIDELINES:**
- **AVOID "fledge" in new directory names** - use functional descriptions
- Use topic-based naming: `authentication/` instead of `fledge_authentication/`
- Keep directory names lowercase with underscores
- Focus on the purpose/feature rather than product branding
### File Naming Conventions
- Use lowercase with underscores: `file_name.rst`
- Index files: `index.rst` for each directory
- Numbered files for version/download info: `91_version_history.rst`, `92_downloads.rst`
- Descriptive names reflecting content: `securing.rst`, `troubleshooting_pi_server_integration.rst`
- **AVOID "fledge" in filenames** - use functional descriptions: `authentication.rst` instead of `fledge_authentication.rst`
- Focus on the topic/feature being documented
## reStructuredText Style Guidelines
### Heading Hierarchy
Follow this exact hierarchy for consistency:
```rst
***************
Document Title (Level 1)
***************
===============
Major Section (Level 2)
===============
Minor Section (Level 3)
-----------------------
Subsection (Level 4)
^^^^^^^^^^^^^^^^^^^^
Sub-subsection (Level 5)
"""""""""""""""""""""""""
```
**IMPORTANT NAMING CONVENTIONS:**
- **AVOID "Fledge" in headings** unless absolutely necessary for context
- Use descriptive, functional titles: "Authentication Configuration" instead of "Fledge Authentication Configuration"
- Focus on the feature/functionality rather than the product name
- Keep headings concise and user-focused
### Document Structure
1. **Title**: Use level 1 heading with asterisks above and below
2. **Introduction**: Brief overview of the document's purpose
3. **Table of Contents**: Use `.. toctree::` for sections with multiple pages
4. **Main Content**: Organized with appropriate heading levels
5. **Cross-references**: Link to related documentation
### Code Blocks
```rst
.. code-block:: language
:linenos:
:emphasize-lines: 2,3
code here
```
### Common Directives
- `.. note::` - Important information
- `.. warning::` - Critical warnings
- `.. code-block::` - Code examples
- `.. image::` - Images with proper alt text
- `.. toctree::` - Table of contents trees
### Images and Media
- Store images in `/docs/images/` directory
- Use descriptive filenames: `architecture_overview.png` (avoid "fledge_" prefix)
- **AVOID "Fledge" in image filenames** - use descriptive terms like `architecture_overview.png` instead of `fledge_architecture_overview.png`
- Always include alt text: `.. image:: images/filename.png :alt: Description`
- Optimize images for web (reasonable file sizes)
- Use subdirectories in images/ for organization by topic
- Keep image names concise and topic-focused
### Cross-References and Links
- Internal references: `:doc:`filename`` or `:ref:`label``
- External links: `Link text <URL>`_
- API references: Follow existing patterns for REST API documentation
## Content Guidelines
### Writing Style
- Use clear, concise language suitable for technical documentation
- Write in active voice when possible
- Use present tense for current functionality
- Include step-by-step instructions for procedures
- Provide context and examples
- **MINIMIZE use of "Fledge" in content** - focus on functionality and features
- Use "the platform", "the system", or specific feature names instead of repetitive "Fledge" references
### Code Examples
- Include complete, runnable examples when possible
- Show both input and expected output
- Use realistic data that represents actual Fledge usage
- Comment code examples appropriately
- Test code examples to ensure they work
### API Documentation
- Document all public APIs, parameters, and return values
- Include HTTP status codes for REST APIs
- Provide curl examples for API endpoints
- Show JSON request/response examples
- Document error conditions and responses
### Configuration Documentation
- Show complete configuration examples
- Explain all configuration parameters
- Provide default values where applicable
- Include configuration validation rules
- Link to related configuration sections
## Sphinx Configuration
### Extensions
- Keep extensions minimal and focused
- Document any new extensions added
- Ensure extensions are available in build environment
### Build Process
- Use `make html` for local builds
- Check for build warnings and errors
- Test documentation locally before committing
- Verify all links work correctly
### Documentation Generation Scripts
- **Location**: `/scripts/` directory contains documentation generation utilities
- **Plugin Discovery**: Scripts automatically scan plugin repositories for `docs/` directories
- **Content Aggregation**: Pulls documentation from external plugin repos during build
- **Branch Management**: Handles DOCBRANCH parameter for version-specific documentation
- **Integration**: Merges external plugin docs with core Fledge documentation seamlessly
### Keywords and Categorization System
- **Keywords Directory**: `/docs/keywords/` contains category definition files
- **Category Mapping**: Each keyword file defines a plugin category (e.g., `Augmentation`, `Cleansing`, `Cloud`)
- **Plugin Keywords**: Plugin repositories contain keyword files that reference category keywords
- **Automatic Categorization**: Build scripts match plugin keywords with category definitions
- **Dynamic Organization**: Plugin list automatically organized into categorical sections
- **Conditional Display**: Categories only appear if plugins with matching keywords exist
### Version Management
- Version information managed in `conf.py`
- DOCBRANCH parameter for plugin documentation
- Update version info during releases
### DOCBRANCH System
- **Purpose**: Generates documentation from both core Fledge and external plugin repositories
- **Core Documentation**: Always included from the main Fledge repository
- **Plugin Documentation**: Pulled from individual plugin repositories if they have a `docs/` directory
- **Branch Control**: Uses `DOCBRANCH='develop'` parameter (set to actual version during releases)
- **Auto-Discovery**: Only includes plugins that have documentation - ignores repos without `docs/` directory
- **Generation Scripts**: Located in `/scripts/` directory handle the plugin documentation aggregation
- **Build Command**: `subprocess.run(["make generated DOCBRANCH='develop'"], shell=True, check=True)` in `conf.py`
## Plugin Documentation
### Plugin Repository Documentation
- **External Plugins**: Each plugin repository can have its own `docs/` directory
- **Auto-Discovery**: Build system automatically includes plugin docs if `docs/` directory exists
- **Repository Requirement**: Plugin repos without `docs/` directory are ignored during documentation generation
- **Branch Synchronization**: Uses same DOCBRANCH parameter as core documentation
- **Integration**: Plugin docs are seamlessly integrated into the main documentation site
### Built-in Plugins (In Core Repository)
The following plugins have documentation included directly in the core Fledge repository:
- **`fledge-rule-DataAvailability/`** - Data availability rule plugin documentation
- **`fledge-rule-Threshold/`** - Threshold rule plugin documentation
- **`fledge-north-OMF.rst`** - OMF north plugin documentation
### Plugin Documentation Standards
- Each plugin should have its own documentation section
- Follow the pattern established in existing plugin docs
- Include installation, configuration, and usage instructions
- Provide troubleshooting sections
- Use the same reStructuredText format and style guidelines
### Auto-Generated Content
- Plugin lists and references may be auto-generated by scripts in `/scripts/` directory
- Don't manually edit generated content
- Use the build system's generation capabilities
- Generated content includes plugin discovery from external repositories
### Plugin Listing System (`fledge_plugins.rst`)
- **Master List**: All plugins are listed with name and description in `fledge_plugins.rst`
- **Smart Hyperlinking**:
- ✅ **With Documentation**: Plugin names become hyperlinks if `docs/` directory exists in plugin repo
- ❌ **Without Documentation**: Plugin names remain as plain text (no hyperlink)
- **Automatic Detection**: Build system checks for documentation availability during generation
- **Comprehensive Coverage**: Includes all available Fledge plugins regardless of documentation status
### Plugin Categorization System
- **Keyword-Based Organization**: Plugins organized by categories using keyword mapping
- **Keywords Directory**: `/docs/keywords/` contains category definitions and mappings
- **Plugin Keywords**: Each plugin repository can have a keywords file defining its categories
- **Categorical Display**: Plugins grouped and displayed under appropriate category sections
- **Dynamic Categorization**: Categories are automatically generated based on available keywords
### Plugin Documentation Sources
- **Core Repository Plugins**: Documentation in `/docs/` for built-in plugins
- **External Plugin Repos**: Each plugin repository can maintain its own `docs/` directory
- **Plugin Directory Reference**: All Fledge-based plugins available in main `plugins/` directory
- **Detailed Documentation**: Comprehensive plugin docs when `docs/` directory exists in plugin repo
### Plugin Documentation Workflow
1. **Plugin Discovery**: Build system scans all available Fledge plugin repositories
2. **Documentation Check**: Determines if plugin repo has `docs/` directory
3. **List Generation**: All plugins added to `fledge_plugins.rst` with name and description
4. **Hyperlink Decision**:
- Plugins WITH docs → Name becomes clickable hyperlink
- Plugins WITHOUT docs → Name remains as plain text
5. **Category Organization**: Plugins grouped by keywords into categorical sections
6. **Integration**: Plugin docs seamlessly integrated into main documentation site
## Quality Standards
### Content Review
- Ensure accuracy of all technical information
- Verify code examples work with current Fledge version
- Check that screenshots are current and accurate
- Review for clarity and completeness
### Accessibility
- Use proper heading hierarchy for screen readers
- Include alt text for all images
- Ensure good color contrast in custom CSS
- Test with accessibility tools
### Maintenance
- Update documentation when features change
- Remove or update deprecated information
- Keep external links current
- Regular review of troubleshooting sections
## Build and Deployment
### Local Testing
```bash
cd docs
make html
# Check _build/html/index.html in browser
```
### Build Warnings
- Address all Sphinx build warnings
- Fix broken internal references
- Verify external links periodically
- Check image references
### Dependencies
- Document build dependencies in `requirements.txt`
- Keep Sphinx version constraints appropriate
- Test builds in clean environments
## Documentation Contribution Guidelines
### New Documentation
- Create comprehensive documentation for new features
- Follow existing patterns and conventions
- Include in appropriate toctree structures
- Add cross-references to related content
### Plugin Documentation Contributions
- **Adding Plugin Docs**: Create `docs/` directory in plugin repository with proper structure
- **Hyperlink Generation**: Plugin names in `fledge_plugins.rst` automatically become hyperlinks when docs exist
- **Keywords Assignment**: Add appropriate keyword files to enable categorical organization
- **Content Standards**: Follow same reStructuredText standards as core documentation
- **Testing**: Verify plugin documentation builds correctly with main documentation site
### Updates
- Update documentation when code changes
- Maintain backwards compatibility information
- Add migration guides for breaking changes
- Update version history appropriately
### Review Process
- Technical accuracy review
- Editorial review for clarity
- Build verification
- Link checking
## Common Patterns
### Getting Started Guides
- Step-by-step instructions
- Prerequisites clearly stated
- Expected outcomes described
- Troubleshooting section included
### Reference Documentation
- Comprehensive parameter listings
- Example configurations
- Default values documented
- Related settings cross-referenced
### Tutorial Content
- Progressive complexity
- Complete working examples
- Clear learning objectives
- Summary and next steps
## Troubleshooting Documentation
### Error Messages
- Include exact error message text
- Provide context for when errors occur
- Give specific resolution steps
- Link to related configuration
### Common Issues
- Document frequently reported problems
- Provide multiple solution approaches
- Include preventive measures
- Reference community resources
This documentation should be treated as living guidelines that evolve with the project's needs while maintaining consistency and quality standards.
================================================
FILE: .cursor/rules/python/api.mdc
================================================
---
description: "Python API development rules for Fledge - REST APIs, routes, middleware, and web services"
globs: "python/fledge/services/*/api/**/*,python/fledge/*/routes.py,python/fledge/common/web/**/*"
alwaysApply: false
author: "Ashish Jabble"
---
# Python API Development Rules
## Python Version & Platform Requirements
### Supported Python Versions
- **Target Range**: Python 3.8.10 - 3.12 (inclusive)
- Always test API compatibility across the full supported range
### Deployment Platforms
- **Ubuntu**: LTS versions, 20.04 onwards
- **Architectures**: x86_64 & aarch64
- **Raspberry Pi OS**: Bullseye and Bookworm distributions
- **Architectures**: aarch64 & armv7l
### Dependencies Management
- **Runtime Dependencies**: [python/requirements.txt](mdc:python/requirements.txt) - Include aiohttp, web framework deps
- **Development Dependencies**: [python/requirements-dev.txt](mdc:python/requirements-dev.txt)
- **Testing Dependencies**: [python/requirements-test.txt](mdc:python/requirements-test.txt) - Include pytest-aiohttp
- **Use exact versions** for production dependencies
- **Consider ARM compatibility** for Raspberry Pi deployment
- **Test across Python versions** and target architectures
## REST API Development
### API Route Definition & Management
- **Core Service Routes**: Defined in [python/fledge/services/core/routes.py](mdc:python/fledge/services/core/routes.py)
- **Microservice Routes**: Exposed at [python/fledge/services/common/microservice_management/routes.py](mdc:python/fledge/services/common/microservice_management/routes.py)
- **API Handlers**: Follow existing patterns in [python/fledge/services/core/api/](mdc:python/fledge/services/core/api/)
### Route Definition Best Practices
```python
# Example route definition with handler
from aiohttp import web
from fledge.services.core.api import my_handler
def setup_routes(app):
"""Setup API routes for the service."""
# Check for existing routes to avoid conflicts
existing_routes = [route.resource.canonical for route in app.router.routes()]
# Define new routes with conflict checking
new_routes = [
('GET', '/fledge/my_endpoint', my_handler.get_data),
('POST', '/fledge/my_endpoint', my_handler.create_data),
('PUT', '/fledge/api/my_endpoint/{id}', my_handler.update_data),
('DELETE', '/fledge/api/my_endpoint/{id}', my_handler.delete_data)
]
for method, path, handler in new_routes:
# Check for route conflicts before adding
if path in existing_routes:
raise ValueError(f"Route conflict: {method} {path} already exists")
app.router.add_route(method, path, handler)
```
### Route Conflict Prevention
- **Endpoint Uniqueness**: Ensure each endpoint path is unique across the application
- **Method Specificity**: Same path can have different HTTP methods (GET, POST, PUT, DELETE)
- **Conflict Detection**: Check existing routes before adding new ones
- **Route Inspection**: Use `app.router.routes()` to inspect existing routes
- **Naming Conventions**: Use descriptive, hierarchical path naming
### Route Organization Guidelines
```python
# Core service routes (routes.py)
CORE_ROUTES = [
# System management
'/fledge/ping',
'/fledge/shutdown',
'/fledge/restart',
# Configuration management
'/fledge/category',
'/fledge/category/{category_name}',
# Plugin management
'/fledge/plugins',
'/fledge/plugins/{plugin_type}',
# Service management
'/fledge/service',
'/fledge/service/{service_name}'
]
# Microservice routes (microservice_management/routes.py)
MICROSERVICE_ROUTES = [
# Service
'/fledge/service/register',
'/fledge/service/unregister',
'/fledge/service/ping',
'/fledge/service/shutdown',
# Health monitoring
'/fledge/service/health',
'/fledge/service/status'
]
```
### API Handler Implementation
```python
# Example API handler with proper structure
from aiohttp import web
from fledge.common.logger import FLCoreLogger
import json
_logger = FLCoreLogger().get_logger(__name__)
async def get_data_handler(request):
"""Handle GET requests for data retrieval."""
try:
# Extract parameters
param_id = request.match_info.get('id')
query_params = request.query
# Validate input
if param_id and not param_id.isdigit():
raise web.HTTPBadRequest(reason="Invalid ID parameter")
# Process request
result = await process_data_request(param_id, query_params)
# Return consistent JSON response (camelCase keys)
response = {
"message": "Data retrieved successfully",
"data": result,
"count": len(result) if isinstance(result, list) else 1
}
return web.json_response(response, status=200)
except ValueError as ex:
_logger.error(ex, "Invalid input parameter")
return web.json_response({"message": str(ex)}, status=400)
except Exception as ex:
_logger.error(ex, "Failed to retrieve data")
return web.json_response({"message": "Internal server error"}, status=500)
```
### Middleware-Based Security & Role Validation
Fledge implements endpoint security and role validation through middleware:
- **Middleware Location**: [python/fledge/common/web/middleware.py](mdc:python/fledge/common/web/middleware.py)
- **Role-Based Access Control**: All endpoint role restrictions handled in middleware
- **Centralized Validation**: Security logic centralized in middleware layer
- **Automatic Enforcement**: Middleware automatically validates roles for protected endpoints
### Role Validation Implementation
```python
# Role validation is handled in middleware.py, not in individual handlers
# The middleware intercepts requests and validates user roles before reaching handlers
# Example of how middleware handles role validation:
async def role_validation_middleware(request, handler):
"""Middleware that validates user roles for protected endpoints."""
# Extract endpoint information
endpoint = request.path
method = request.method
# Check if endpoint requires specific roles
required_roles = get_endpoint_roles(endpoint, method)
if required_roles:
# Validate user authentication and roles
user_roles = await get_user_roles(request)
if not any(role in user_roles for role in required_roles):
return web.json_response(
{"message": "Insufficient permissions"},
status=403
)
# Continue to handler if validation passes
return await handler(request)
```
### Endpoint Role Configuration
Role requirements for endpoints are configured and enforced by middleware:
```python
# Middleware handles role mapping for different endpoints
ENDPOINT_ROLES = {
# Administrative operations - admin only
'/fledge/shutdown': ['admin'],
'/fledge/restart': ['admin'],
'/fledge/service': ['admin'],
'/fledge/certificate': ['admin'],
# Configuration management - admin and editor
'/fledge/configuration': ['admin', 'editor'],
'/fledge/plugins': ['admin', 'editor'],
'/fledge/category': ['admin', 'editor'],
# Control operations - admin, editor, and control
'/fledge/schedule': ['admin', 'editor', 'control'],
'/fledge/notification': ['admin', 'editor', 'control'],
'/fledge/control/pipeline': ['admin', 'editor', 'control'],
'/fledge/control/script': ['admin', 'editor', 'control'],
# Data viewing - admin, editor, control, data-view, and view
'/fledge/asset': ['admin', 'editor', 'control', 'data-view', 'view'],
'/fledge/reading': ['admin', 'editor', 'control', 'data-view', 'view'],
'/fledge/statistics': ['admin', 'editor', 'control', 'data-view', 'view'],
# General viewing - all authenticated roles
'/fledge/ping': ['admin', 'editor', 'control', 'data-view', 'view'],
'/fledge/health': ['admin', 'editor', 'control', 'data-view', 'view'],
'/fledge/audit': ['admin', 'editor', 'control', 'data-view', 'view'],
# Public endpoints - no authentication required
'/fledge/login': [],
'/fledge/logout': []
}
# Role Hierarchy (from most to least privileged):
# admin - Full system access, can modify everything
# editor - Can modify configurations and data processing
# control - Can manage control operations and pipelines
# data-view - Can view data and readings but not modify
# view - Basic viewing access, limited data access
# Middleware automatically enforces these role requirements
# No need to implement role checking in individual handlers
```
### Security Best Practices for Middleware
- **Centralized Role Management**: All role validation handled in middleware.py
- **Handler Independence**: Handlers focus on business logic, not security
- **Consistent Enforcement**: Same security rules applied across all endpoints
- **Configuration-Based**: Role requirements configured, not hardcoded
- **Audit Trail**: Middleware logs all security validation attempts
- **Error Handling**: Proper HTTP status codes for authorization failures
### REST API Standards
- Use proper HTTP status codes (200, 201, 400, 401, 403, 404, 500)
- Implement proper authentication/authorization through middleware
- Validate all input parameters thoroughly
- Return consistent JSON response formats (camelCase for API keys)
- Include comprehensive error handling and logging
- Follow RESTful conventions for HTTP methods and endpoints
- Apply security middleware to all protected endpoints
- Use role-based access control for sensitive operations
## Microservice Communication
- Use the microservice management client from [python/fledge/common/microservice_management_client/](mdc:python/fledge/common/microservice_management_client/)
- Handle service discovery properly
- Implement proper retry logic with exponential backoff
- Use appropriate timeouts for service calls
## Async/Await Patterns
- Use async/await for I/O operations (database, HTTP, file operations)
- Properly handle asyncio event loops
- Use aiohttp for HTTP client operations
- Follow existing async patterns in the codebase
- Be mindful of blocking operations in async contexts
================================================
FILE: .cursor/rules/python/config.mdc
================================================
---
description: "Python configuration and data management rules for Fledge - config system, reading objects, and data types"
globs: "python/fledge/common/configuration*,python/fledge/services/*/configuration*,**/config*.py"
alwaysApply: false
author: "Ashish Jabble"
---
# Python Configuration & Data Management Rules
## Python Version & Platform Requirements
### Supported Python Versions
- **Target Range**: Python 3.8.10 - 3.12 (inclusive)
- Always test configuration handling across the full supported range
### Deployment Platforms
- **Ubuntu**: LTS versions, 20.04 onwards
- **Architectures**: x86_64 & aarch64
- **Raspberry Pi OS**: Bullseye and Bookworm distributions
- **Architectures**: aarch64 & armv7l
### Dependencies Management
- **Runtime Dependencies**: [python/requirements.txt](mdc:python/requirements.txt) - Include config validation deps
- **Development Dependencies**: [python/requirements-dev.txt](mdc:python/requirements-dev.txt)
- **Testing Dependencies**: [python/requirements-test.txt](mdc:python/requirements-test.txt) - Include config testing tools
- **Use exact versions** for production dependencies
- **Consider ARM compatibility** for Raspberry Pi deployment
- **Test across Python versions** and target architectures
## Configuration Management
### Configuration System
- Use the Fledge configuration management system consistently
- Store configuration in JSON format
- Validate configuration parameters thoroughly
- Provide sensible defaults for all configuration options
- Handle configuration changes gracefully
### Configuration Categories & Types
Fledge configuration manager supports various types with specific formatting requirements:
```python
# Example configuration category definitions
config_category = {
"string_example": {
"description": "A string configuration parameter",
"type": "string",
"default": "default_value", # Always wrap in quotes
"value": "current_value" # Always wrap in quotes
},
"integer_example": {
"description": "An integer configuration parameter",
"type": "integer",
"default": "42", # Wrap in quotes but validate as integer
"value": "100" # Wrap in quotes but validate as integer
},
"boolean_example": {
"description": "A boolean configuration parameter",
"type": "boolean",
"default": "false", # Wrap in quotes: "true" or "false"
"value": "true" # Wrap in quotes: "true" or "false"
},
"float_example": {
"description": "A float configuration parameter",
"type": "float",
"default": "3.14", # Wrap in quotes but validate as float
"value": "2.71" # Wrap in quotes but validate as float
},
"enumeration_example": {
"description": "An enumeration configuration parameter",
"type": "enumeration",
"options": ["option1", "option2", "option3"],
"default": "option1", # Wrap in quotes, must be from options
"value": "option2" # Wrap in quotes, must be from options
},
"JSON_example": {
"description": "A JSON object configuration parameter",
"type": "JSON",
"default": "{\"key\": \"value\"}", # JSON string wrapped in quotes
"value": "{\"key\": \"updated\"}" # JSON string wrapped in quotes
}
}
```
### Supported Configuration Types
Fledge configuration manager supports the following types:
- **string**: Text values (default type if not specified)
- **integer**: Whole numbers
- **float**: Decimal numbers
- **boolean**: True/false values ("true"/"false" as strings)
- **enumeration**: Predefined list of options
- **JSON**: Complex objects or arrays
- **password**: Encrypted/masked string values
- **X509 certificate**: Certificate data
- **code**: Editable code blocks (Python, JavaScript, etc.)
### Optional Configuration Items
Configuration parameters can include optional properties:
```python
config_with_optional_items = {
"advanced_parameter": {
"description": "An advanced configuration parameter",
"type": "integer",
"default": "100",
"value": "150",
# Optional items
"minimum": "1", # Minimum allowed value
"maximum": "1000", # Maximum allowed value
"length": "10", # Maximum string length (for string types)
"rule": "value > 0", # Validation rule expression
"order": "10", # Display order in UI
"readonly": "false", # Whether value can be modified
"options": ["opt1", "opt2"], # Available options (for enumeration)
"displayName": "Advanced Parameter", # UI display name
"validity": "valid", # Validation status
"group": "advanced" # Grouping for UI organization
}
}
```
### Reserved Configuration Categories
Certain category names are reserved by the Fledge configuration manager:
```python
# Reserved category names - DO NOT USE for custom configurations
RESERVED_CATEGORIES = [
"General", # Core system configuration
"Advanced", # Advanced system settings
"Utilities", # System utilities configuration
"Security", # Security-related settings
"rest_api", # REST API configuration
"service", # Service-level configuration
"storage", # Storage plugin configuration
"scheduler", # Task scheduler configuration
"dispatcher", # Dispatcher service configuration
"logging", # Logging configuration
"authentication", # Authentication settings
"authorization", # Authorization settings
"certificate_store", # Certificate management
"audit", # Audit logging configuration
"performance" # Performance monitoring settings
]
# Use descriptive, specific names for plugin/service configurations
# Good examples:
GOOD_CATEGORY_NAMES = [
"modbus_tcp", # Specific protocol/plugin name
"opcua_client", # Specific functionality
"http_north", # Service type and direction
"pi_web_api", # Specific target system
"temperature_filter", # Specific filter purpose
]
```
### Configuration Value Handling Rules
- **Quote Wrapping**: Always wrap `default` and `value` in double quotes (`""`)
- **Type Validation**: Explicitly validate values against their declared type
- **Type Conversion**: Convert string values to appropriate types during processing
- **Validation Examples**:
```python
def validate_config_value(value: str, config_type: str) -> bool:
"""Validate configuration value against its type."""
try:
if config_type == "integer":
int(value) # Must be convertible to int
elif config_type == "float":
float(value) # Must be convertible to float
elif config_type == "boolean":
return value.lower() in ["true", "false"]
elif config_type == "JSON":
json.loads(value) # Must be valid JSON
# string and enumeration are validated separately
return True
except (ValueError, json.JSONDecodeError):
return False
```
### Reading Object Format
Fledge uses a specific reading object format for sensor data:
```python
# Standard Fledge reading object structure
reading_object = {
"asset": "sensor_name", # Asset name (string)
"timestamp": "2024-01-01 12:00:00.000", # ISO timestamp with milliseconds
"readings": { # Dictionary of sensor readings
"temperature": 25.5, # Numeric values (int/float)
"humidity": 60.2,
"pressure": 1013.25,
"status": "online" # String values allowed
}
}
# Multiple readings in a single object
reading_batch = [
{
"asset": "sensor01",
"timestamp": "2024-01-01 12:00:00.000",
"readings": {"temperature": 25.5, "humidity": 60.2}
},
{
"asset": "sensor02",
"timestamp": "2024-01-01 12:00:01.000",
"readings": {"pressure": 1013.25, "wind_speed": 12.3}
}
]
```
### Configuration Best Practices
- **Descriptive Names**: Use clear, descriptive configuration parameter names
- **Validation**: Always validate configuration values against their types
- **Error Handling**: Provide clear error messages for invalid configurations
- **Documentation**: Include comprehensive descriptions for all parameters
- **Defaults**: Provide sensible defaults that work in most environments
- **Type Safety**: Ensure type conversion is handled safely with proper error checking
- **Reading Format**: Follow standard Fledge reading object structure for sensor data
- **Reserved Categories**: Avoid using reserved category names for custom configurations
- **Optional Items**: Use optional configuration properties for advanced validation and UI control
- **Type Selection**: Choose appropriate types (use "password" for sensitive data, "code" for scripts)
- **Validation Rules**: Implement proper minimum/maximum constraints and custom validation rules
## Database Operations
- Use the storage service abstraction from [python/fledge/common/storage_client/](mdc:python/fledge/common/storage_client/)
- Handle database connection errors gracefully
- Use prepared statements for SQL queries
- Consider performance for large datasets
- Implement proper connection pooling
## Error Handling
- Use specific exception types rather than generic Exception
- Log errors with appropriate severity levels using Fledge logging framework
- Handle async operations properly with try/catch blocks
- Return meaningful error messages for API responses
- Consider edge computing constraints when handling errors
## Security Considerations
- Validate all input parameters to prevent injection attacks
- Use secure defaults for configuration
- Handle certificates and keys securely
- Follow authentication/authorization patterns
- Sanitize data before database operations
- Never log sensitive information
================================================
FILE: .cursor/rules/python/core.mdc
================================================
---
description: "Core Python development rules for Fledge - code style, imports, file structure, and naming conventions"
globs: "*.py,python/**/*"
alwaysApply: false
author: "Ashish Jabble"
---
# Python Core Development Rules
## Python Version & Platform Requirements
### Supported Python Versions
- **Minimum**: Python 3.8.10
- **Maximum**: Python 3.12
- **Target Range**: Python 3.8.10 - 3.12 (inclusive)
- Always test compatibility across the full supported range
### Deployment Platforms
- **Ubuntu**: LTS versions, 20.04 onwards
- **Architectures**: x86_64 & aarch64
- **Raspberry Pi OS**: Bullseye and Bookworm distributions
- **Architectures**: aarch64 & armv7l
### Dependencies Management
- **Runtime Dependencies**: [python/requirements.txt](mdc:python/requirements.txt)
- **Development Dependencies**: [python/requirements-dev.txt](mdc:python/requirements-dev.txt)
- **Testing Dependencies**: [python/requirements-test.txt](mdc:python/requirements-test.txt)
- **Use exact versions** for production dependencies
- **Consider ARM compatibility** for Raspberry Pi deployment
- **Test across Python versions** and target architectures
- **Edge Devices**: Resource-constrained environments with limited CPU/memory
- Consider platform-specific limitations and optimizations
### Supported Architectures
- **Ubuntu**: x86_64 & aarch64 architectures
- **Raspberry Pi OS**: aarch64 & armv7l architectures
- **Cross-Platform Testing**: Ensure compatibility across all supported architectures
- **Performance Considerations**: ARM-based architectures may have different performance characteristics
### Compatibility Guidelines
- Use language features available in Python 3.8.10+ only
- Test on all supported architectures: x86_64, aarch64, and armv7l
- Consider performance implications on ARM-based edge devices (aarch64, armv7l)
- Handle platform-specific dependencies appropriately
- Validate package availability across all target architectures
## Code Style & Standards
- Follow PEP 8 style guidelines strictly
- Use type hints where appropriate for better code documentation (Python 3.8.10+ compatible)
- Maximum line length: 120 characters
- Use 4 spaces for indentation (never tabs)
- Import order: standard library, third-party, local imports
- Use double quotes for strings consistently
- Use descriptive variable and function names
### Import Management & Circular Dependencies
- **Avoid Circular Imports**: Prevent circular dependency issues that can cause import failures
- **Local Imports**: Use local imports only as a last resort when no other option exists
- **Import Testing**: Ensure local imports actually work and don't break during runtime
- **Dependency Design**: Restructure code to eliminate need for circular imports when possible
### Circular Import Prevention Strategies
```python
# BAD: Top-level import causing circular dependency
from fledge.services.core import server # This can cause circular import
# BETTER: Local import as last resort (with comment explaining why)
def get_server_instance():
"""Get server instance with local import to avoid circular dependency."""
# Require a local import in order to avoid circular import references
from fledge.services.core import server
return server
# BEST: Dependency injection or refactoring to avoid the need
class MyHandler:
def __init__(self, server_instance=None):
self._server = server_instance
def process_request(self):
if self._server:
return self._server.get_info()
# ALTERNATIVE: Use interfaces/protocols to break dependencies
from typing import Protocol
class ServerProtocol(Protocol):
def get_info(self) -> dict: ...
def shutdown(self) -> None: ...
class MyService:
def __init__(self, server: ServerProtocol):
self._server = server
```
### Local Import Guidelines
When local imports are unavoidable:
- **Document Reasoning**: Always comment why local import is necessary
- **Test Thoroughly**: Ensure the import works in all execution contexts
- **Minimal Scope**: Keep local imports as close to usage as possible
- **Error Handling**: Handle potential import failures gracefully
- **Consider Alternatives**: Always look for architectural solutions first
```python
def handle_server_operation():
"""Handle operation requiring server access."""
try:
# Local import to avoid circular dependency - server imports this module
from fledge.services.core import server
# Verify the import worked
if not hasattr(server, 'expected_method'):
raise ImportError("Server module not properly initialized")
return server.expected_method()
except ImportError as ex:
_logger.error(ex, "Failed to import server module")
raise RuntimeError("Server not available") from ex
```
### Documentation Standards
- **Docstrings**: Use pydoc-compatible docstrings for all public functions, classes, and modules
- **Docstring Format**: Follow PEP 257 and Google/NumPy style for consistency
- **Mandatory Docstrings**: Required for:
- All public functions and methods
- All public classes
- All modules (module-level docstring)
- Complex private functions (use judgment)
- **Missing Docstrings**: Complain/flag when docstrings are missing for public APIs
### Docstring Examples
```python
def get_user_data(user_id: int, include_settings: bool = False) -> dict:
"""Retrieve user data from the database.
Args:
user_id: The unique identifier for the user
include_settings: Whether to include user settings in response
Returns:
dict: User data with keys 'id', 'name', 'email', and optionally 'settings'
Raises:
ValueError: If user_id is not a positive integer
DatabaseError: If database connection fails
Example:
>>> user_data = get_user_data(123, include_settings=True)
>>> print(user_data['name'])
'John Doe'
"""
pass
class DeviceManager:
"""Manages IoT device connections and data collection.
This class handles the lifecycle of IoT devices including discovery,
connection management, and data retrieval from various sensor types.
Attributes:
device_count: Number of currently connected devices
connection_timeout: Timeout in seconds for device connections
Example:
>>> manager = DeviceManager()
>>> manager.connect_device("sensor_01")
>>> data = manager.get_device_data("sensor_01")
"""
pass
```
### Docstring Quality Standards
- **Clear and Concise**: Describe what the function/class does, not how
- **Parameter Documentation**: Document all parameters with types and descriptions
- **Return Value Documentation**: Describe return types and structure
- **Exception Documentation**: List all exceptions that may be raised
- **Usage Examples**: Include practical examples for complex functions
- **pydoc Compatibility**: Ensure docstrings render correctly with `python -m pydoc module_name`
### Naming Conventions
- **Variables**: Use snake_case for all variable names
```python
user_id = 123
device_name = "sensor_01"
connection_timeout = 30
```
- **Functions/Methods**: Use snake_case for all function and method names
```python
def get_user_data():
pass
def process_sensor_reading(reading_value):
pass
```
- **Classes**: Use PascalCase for class names (following PEP 8)
```python
class DeviceManager:
pass
class SensorDataProcessor:
pass
```
- **Constants**: Use UPPER_SNAKE_CASE for constants
```python
MAX_RETRY_COUNT = 3
DEFAULT_TIMEOUT_SECONDS = 30
API_BASE_URL = "https://api.example.com"
```
### API Response Naming
- **API Response Keys**: Always use camelCase for JSON response keys
```python
# Correct API response format
response = {
"userId": 123,
"deviceName": "sensor_01",
"lastReadingTime": "2024-01-01T12:00:00Z",
"sensorData": {
"temperature": 25.5,
"humidity": 60.2
}
}
```
- **Internal Code**: Use snake_case everywhere else (variables, function names, etc.)
- **Database Fields**: Use snake_case for database column names and internal data structures
## File Structure & Organization
- Python code lives in [python/fledge/](mdc:python/fledge/) directory
- Follow the existing module structure:
- [python/fledge/common/](mdc:python/fledge/common/) - shared utilities and common functionality
- [python/fledge/services/](mdc:python/fledge/services/) - core services implementation
- [python/fledge/tasks/](mdc:python/fledge/tasks/) - background tasks and scheduled operations
- [python/fledge/plugins/](mdc:python/fledge/plugins/) - plugin interfaces and base classes
### Core Microservice Architecture
- **`server.py`**: The heart of the core microservice - central orchestration and service management
- **Core Service Location**: [python/fledge/services/core/server.py](mdc:python/fledge/services/core/server.py)
- **Critical Component**: Handles microservice lifecycle, service discovery, and core coordination
- **Service Entry Point**: Primary entry point for the core Fledge service
- **Integration Hub**: Coordinates between all other services, plugins, and components
================================================
FILE: .cursor/rules/python/quality.mdc
================================================
---
description: "Python quality rules for Fledge - dependencies, logging, performance, and version compatibility"
globs: "python/requirements*.txt"
alwaysApply: false
author: "Ashish Jabble"
---
# Python Quality & Best Practices Rules
## Dependencies & Requirements Management
### Requirements Files Structure
- **[python/requirements.txt](mdc:python/requirements.txt)** - Runtime dependencies for production
- **[python/requirements-dev.txt](mdc:python/requirements-dev.txt)** - Development dependencies (includes runtime + test)
- **[python/requirements-test.txt](mdc:python/requirements-test.txt)** - Testing framework dependencies
### Version-Specific Dependencies
- Use Python version markers for compatibility: `package==version;python_version>="3.12"`
- Example patterns from existing requirements:
```
aiohttp==3.8.6;python_version<"3.12"
aiohttp==3.10.11;python_version>="3.12"
yarl==1.7.2;python_version<="3.10"
yarl==1.9.4;python_version>="3.11" and python_version<"3.12"
```
### Dependency Guidelines
- **Always specify exact versions** for production dependencies
- **Use version markers** when different Python versions require different package versions
- **Test across Python versions** to ensure compatibility
- **Keep requirements files in sync** - test dependencies should match runtime versions
- **Document reasoning** for version-specific constraints in comments
- **Consider ARM compatibility** for Raspberry Pi deployment
### Requirements File Documentation
- **Add comments** explaining version constraints and Python version markers
- **Document platform-specific requirements** (e.g., ARM vs x86_64)
- **Explain version ranges** when multiple versions are supported for different Python versions
- **Include installation notes** for complex dependencies
- **Reference upstream issues** when using specific versions due to bugs or compatibility
## Logging
### Logging Framework
- **Use FLCoreLogger class** for all logging operations
- **Multi-stacktrace support**: FLCoreLogger handles complex stacktrace scenarios
- Import from fledge.common.logger: `from fledge.common.logger import FLCoreLogger`
- Create logger instance: `_logger = FLCoreLogger().get_logger(__name__)`
### Logging Best Practices
- Use the Fledge logging framework consistently across all components
- Include appropriate context in log messages for debugging
- Use proper log levels (DEBUG, INFO, WARNING, ERROR)
- Avoid logging sensitive information (passwords, tokens, API keys, etc.)
- Structure log messages for easy parsing and analysis
### FLCoreLogger Usage Examples
```python
from fledge.common.logger import FLCoreLogger
_logger = FLCoreLogger().get_logger(__name__)
# Standard logging
_logger.info("Service started successfully")
_logger.warning("Configuration parameter missing, using default")
_logger.error("Failed to connect to database")
# Multi-stacktrace scenarios (handled automatically by FLCoreLogger)
try:
# Complex operation that might have nested exceptions
result = complex_operation()
except Exception as ex:
_logger.error(ex, "Complex operation failed")
```
### Log Message Guidelines
- Use descriptive messages that provide context
- Include relevant data (IDs, names, values) but avoid sensitive information
- Use consistent formatting for similar log types
- Consider log aggregation and searching when structuring messages
## Testing Integration
- **Unit Testing**: Detailed unit testing guidelines are in [python/unit.mdc](mdc:python/unit.mdc)
- **System Testing**: Located in [tests/system/python/](mdc:tests/system/python/)
- **Test Documentation**: Follow [tests/README.rst](mdc:tests/README.rst) for complete testing instructions
## Performance Guidelines
### Edge Computing Optimization
- **Memory Constraints**: Raspberry Pi and edge devices have limited RAM
- **CPU Limitations**: ARM processors may be slower than x86_64
- **Storage Constraints**: Limited disk space on edge devices
- **Network Considerations**: Potentially unreliable or slow connections
### Performance Best Practices
- Optimize database queries and use appropriate indexes
- Use appropriate caching strategies (consider memory limits)
- Monitor resource usage in production environments
- Profile performance-critical code paths on target platforms
- Minimize blocking operations in async code
- **Test on Raspberry Pi** for realistic performance validation
- Consider memory-efficient data structures and algorithms
- Implement graceful degradation under resource pressure
## Version Compatibility & Testing
### Python Version Testing
- **Test across full range**: Python 3.8.10 through 3.12
- **Use CI/CD matrices** to validate on multiple Python versions
- **Avoid deprecated features** that may be removed in newer versions
- **Use version-specific workarounds** when necessary with clear documentation
### Platform Testing
- **Ubuntu Testing**: Primary development and deployment platform (LTS 20.04+)
- **Raspberry Pi Testing**: ARM architecture and resource constraints
- **Cross-Architecture**: Ensure code works on x86_64, aarch64, and armv7l
- **Performance Validation**: Test on actual Raspberry Pi hardware when possible
- **Architecture-Specific Testing**: Validate on all supported architectures:
- x86_64 (Ubuntu)
- aarch64 (Ubuntu & Raspberry Pi OS)
- armv7l (Raspberry Pi OS)
### Compatibility Guidelines
- Maintain backwards compatibility for APIs across supported Python versions
- Use `sys.version_info` checks for version-specific code paths
- Document breaking changes clearly in commit messages and documentation
- Consider dependency availability across Python versions and platforms
- Test package installation on both Ubuntu and Raspberry Pi OS
## Plugin Development
- Implement proper plugin interfaces defined in [python/fledge/plugins/](mdc:python/fledge/plugins/)
- Handle plugin lifecycle properly (start, stop, reconfigure)
- Use the plugin configuration system
- Follow existing plugin patterns for consistency
- Consider performance implications for edge devices
================================================
FILE: .cursor/rules/tests/python/api.mdc
================================================
---
description: "Python API integration testing rules for Fledge - conftest fixtures, HTTP client patterns, and API test organization"
globs: "tests/system/python/api/**/*.py,tests/system/python/conftest.py"
alwaysApply: false
author: "Ashish Jabble"
---
# API integration Testing Guidelines
## Test Organization & Structure
### Directory Structure
- **API integration Tests**: Located in [tests/system/python/api/](mdc:tests/system/python/api/)
- **Main conftest**: [tests/system/python/conftest.py](mdc:tests/system/python/conftest.py) - Contains shared fixtures
- **pytest Configuration**: [tests/system/python/pytest.ini](mdc:tests/system/python/pytest.ini)
- **Test Documentation**: Follow [tests/README.rst](mdc:tests/README.rst) for execution instructions
### Test File Conventions
- **Naming**: Test files must begin with `test_` for pytest auto-discovery
- **Pattern**: `test_<api_area>.py` (e.g., `test_authentication.py`, `test_configuration.py`)
- **Location**: All API tests in `tests/system/python/api/` directory
- **Imports**: Always include `import http.client` for HTTP connections
- **Documentation**: Include module docstrings describing the API area being tested
### Test Class Organization
- **Class Naming**: Use `TestClassName` pattern (e.g., `TestAuthenticationAPI`, `TestCommon`)
- **Method Naming**: Use descriptive names like `test_login_username_regular_user`
- **Test Flow**: Organize tests to follow logical API workflows
- **Dependencies**: Use fixtures to manage test prerequisites and cleanup
## HTTP Client Standards
### Required HTTP Library
- **MUST USE**: `http.client` library only for HTTP/HTTPS connections
- **NO requests library**: Do not use `requests` - system tests use `http.client` exclusively
- **Import Pattern**: Always include `import http.client` at the top of test files
### HTTP Connection Patterns
#### Basic Connection Setup
```python
import http.client
import json
def test_api_endpoint(self, fledge_url):
conn = http.client.HTTPConnection(fledge_url)
conn.request("GET", "/fledge/ping")
r = conn.getresponse()
assert 200 == r.status
r = r.read().decode()
jdoc = json.loads(r)
```
#### POST Requests with JSON Data
```python
def test_post_with_data(self, fledge_url):
conn = http.client.HTTPConnection(fledge_url)
data = {"key": "value"}
conn.request("POST", "/fledge/endpoint", json.dumps(data))
r = conn.getresponse()
assert 200 == r.status
response_data = json.loads(r.read().decode())
```
#### Authenticated Requests
```python
def test_authenticated_request(self, fledge_url):
conn = http.client.HTTPConnection(fledge_url)
headers = {"authorization": TOKEN}
conn.request("GET", "/fledge/protected", headers=headers)
r = conn.getresponse()
assert 200 == r.status
```
### HTTP Best Practices
- **Status Code Validation**: Always assert expected HTTP status codes
- **Response Decoding**: Use `r.read().decode()` to get response text
- **JSON Handling**: Use `json.loads()` and `json.dumps()` for JSON data
- **Connection Reuse**: Create new connections per test method for isolation
- **Error Handling**: Test both success and error response scenarios
## Core Conftest Fixtures
### Essential Fixtures for API Testing
#### `reset_and_start_fledge`
Primary fixture for test environment setup:
```python
def test_api_method(self, reset_and_start_fledge, fledge_url):
# Test runs with fresh Fledge instance
```
- **Purpose**: Kills Fledge, resets database, and starts fresh instance
- **Parameters**: Uses `storage_plugin`, `readings_plugin`, `authentication` fixtures
- **Usage**: Include as first parameter in test methods that need clean environment
#### `fledge_url`
Provides Fledge server connection details:
```python
def test_connection(self, fledge_url):
conn = http.client.HTTPConnection(fledge_url)
```
- **Default**: "localhost:8081"
- **Override**: Use `--fledge-url` command line option
- **Usage**: Required for all HTTP connections to Fledge
#### `storage_plugin`
Specifies database plugin for tests:
```python
@pytest.fixture
def storage_plugin(request):
return request.config.getoption("--storage-plugin")
```
- **Default**: "sqlite"
- **Options**: "sqlite", "postgres", "sqlitelb"
- **Usage**: Used by `reset_and_start_fledge` fixture
#### `authentication`
Defines authentication mode:
```python
@pytest.fixture
def authentication():
return "optional" # or "mandatory"
```
- **Default**: "optional"
- **Override**: Define in individual test files for specific auth requirements
- **Usage**: Controls Fledge authentication configuration
### Additional Service Management Fixtures
#### `add_south`
Adds and configures south services:
```python
def test_with_south_service(self, add_south, fledge_url):
south_service = add_south("sinusoid", None, fledge_url, "test_service")
```
#### `add_north`
Adds and configures north services/tasks:
```python
def test_with_north_task(self, add_north, fledge_url):
north_task = add_north(fledge_url, "http_north", None, "make", "test_task")
```
#### `add_service`
Adds generic services:
```python
def test_with_service(self, add_service, fledge_url):
service = add_service(fledge_url, "notification", None, 3, "make", "test_svc")
```
### Utility Fixtures
#### `wait_time` and `retries`
Control test timing and retry behavior:
```python
def test_with_timing(self, fledge_url, wait_time, retries):
time.sleep(wait_time) # Default: 5 seconds
# Retry logic using retries count (default: 3)
```
#### `remove_data_file` and `remove_directories`
Cleanup utilities for test data:
```python
def test_with_cleanup(self, remove_data_file, remove_directories):
# Test creates files/directories
remove_data_file("/path/to/test/file")
remove_directories("/path/to/test/dir")
```
## Test Configuration
### pytest Configuration
- **File**: [tests/system/python/pytest.ini](mdc:tests/system/python/pytest.ini)
- **Default Options**: `--wait-time=6 --retries=4`
- **Command Line Options**: Extensive options for test customization
### Common Command Line Options
```bash
# Basic test execution
pytest tests/system/python/api/test_authentication.py
# With custom Fledge URL
pytest --fledge-url=192.168.1.100:8081 tests/system/python/api/
# With different storage plugin
pytest --storage-plugin=postgres tests/system/python/api/
# With custom timing
pytest --wait-time=10 --retries=5 tests/system/python/api/
```
### Available Command Line Arguments
- `--storage-plugin`: Database plugin ("sqlite", "postgres", "sqlitelb")
- `--readings-plugin`: Readings plugin ("Use main plugin", "sqlitememory", etc.)
- `--fledge-url`: Fledge server URL (default: "localhost:8081")
- `--wait-time`: Generic wait time between processes (default: 5)
- `--retries`: Number of retry attempts (default: 3)
- `--south-branch`, `--north-branch`: Plugin branch names for installation
- `--use-pip-cache`: Use pip cache for plugin installations
## API Testing Best Practices
### Test Design Principles
- **Environment Isolation**: Use `reset_and_start_fledge` for clean test environments
- **Fixture Dependencies**: Properly order fixtures based on dependencies
- **Response Validation**: Validate both status codes and response content
- **Error Scenarios**: Test both success and failure paths
- **Authentication**: Handle both authenticated and unauthenticated scenarios
### Common Testing Patterns
#### Basic API Endpoint Test
```python
class TestEndpoint:
def test_get_endpoint(self, reset_and_start_fledge, fledge_url):
conn = http.client.HTTPConnection(fledge_url)
conn.request("GET", "/fledge/endpoint")
r = conn.getresponse()
assert 200 == r.status
jdoc = json.loads(r.read().decode())
assert "expected_key" in jdoc
```
#### Authentication Flow Test
```python
class TestAuthentication:
def test_login_flow(self, fledge_url, authentication, reset_and_start_fledge):
# Login
conn = http.client.HTTPConnection(fledge_url)
conn.request("POST", "/fledge/login",
json.dumps({"username": "user", "password": "password"}))
r = conn.getresponse()
assert 200 == r.status
jdoc = json.loads(r.read().decode())
token = jdoc["token"]
# Use token for authenticated request
conn.request("GET", "/fledge/protected", headers={"authorization": token})
r = conn.getresponse()
assert 200 == r.status
```
#### Service Configuration Test
```python
class TestServiceConfiguration:
def test_service_creation(self, add_south, fledge_url):
service_name = "test_service"
config = {"key": "value"}
service = add_south("plugin_name", None, fledge_url, service_name, config)
assert service["name"] == service_name
```
### Error Testing Guidelines
- **Invalid Requests**: Test malformed JSON, missing parameters
- **Authentication Errors**: Test unauthorized access, invalid tokens
- **Resource Not Found**: Test non-existent endpoints and resources
- **Constraint Violations**: Test duplicate names, invalid configurations
- **Server Errors**: Test scenarios that trigger 500-level responses
### Data Validation Patterns
- **JSON Structure**: Validate response JSON contains expected keys
- **Data Types**: Verify correct data types in responses
- **Value Ranges**: Check that numeric values are within expected ranges
- **String Formats**: Validate UUIDs, timestamps, and formatted strings
- **Array Contents**: Check array lengths and element structures
## Integration with System Testing
### Plugin Installation Testing
- Use fixtures like `add_south`, `add_north` for plugin integration tests
- Test both `make` and `package` installation types
- Validate plugin discovery and configuration
### Multi-Service Testing
- Combine multiple fixtures to test service interactions
- Test data flow between south and north services
- Validate configuration propagation across services
### Performance and Timing
- Use `wait_time` and `retries` for timing-sensitive tests
- Account for Fledge startup and shutdown times
- Test timeout scenarios and retry mechanisms
## Test Execution Guidelines
### Local Development
```bash
# Run all API tests
cd tests/system/python
pytest api/
# Run specific test file
pytest api/test_authentication.py
# Run with Disables output capturing
pytest -s api/test_authentication.py
# Run with verbose output
pytest -v api/test_configuration.py
# Run with very verbose output
pytest -vv api/test_configuration.py
# Run with custom Fledge instance
pytest --fledge-url=localhost:8082 api/
```
### Continuous Integration
- Use matrix testing for different storage plugins
- Test across multiple Python versions
- Validate on different deployment architectures
- Include both authenticated and unauthenticated test runs
================================================
FILE: .cursor/rules/tests/python/unit.mdc
================================================
---
description: "Python unit testing rules for Fledge - test organization, framework, execution, and coverage"
globs: "tests/unit/python/**/*.py,**/test_*.py,python/requirements-test.txt"
alwaysApply: false
author: "Ashish Jabble"
---
# Python Unit Testing Guidelines
## Test Organization & Structure
### Directory Structure
- **Unit Tests**: Located in [tests/unit/python/](mdc:tests/unit/python/)
- **Test Instructions**: Follow detailed guidelines in [tests/README.rst](mdc:tests/README.rst)
- **File Structure**: Tests should mirror the component structure under `tests/unit/python/fledge/<component>`
- **Template**: Use [tests/unit/python/__template__.py](mdc:tests/unit/python/__template__.py) as starting point
### Test File Conventions
- **Naming**: Test files must begin with `test_` for pytest auto-discovery
- **Pattern**: `test_<module_name>.py`
- **Location**: Place tests in correct directory matching component structure
- **Imports**: Follow Fledge import patterns and avoid circular dependencies
- **Docstrings**: Include Pydoc-compatible docstrings for test classes and methods
### Test Class & Method Organization
- Group related tests in classes using `TestClassName` pattern
- Use descriptive test method names: `test_should_return_success_when_valid_input`
- Organize tests logically: happy path, edge cases, error conditions
- Use pytest fixtures for common setup and teardown
- Keep tests focused and atomic - one assertion per test when possible
## Testing Framework & Dependencies
### Primary Framework
- **Framework**: pytest (version specified in [python/requirements-test.txt](mdc:python/requirements-test.txt))
- **Dependencies**: All testing dependencies are managed in requirements-test.txt
- **Dependency Management**: Reference requirements-test.txt for current versions - do not hardcode versions in documentation
### Core Testing Dependencies
Key testing packages (see [python/requirements-test.txt](mdc:python/requirements-test.txt) for current versions):
- `pytest` - Main testing framework
- `pytest-asyncio` - For async testing support
- `pytest-mock` - Mocking framework integration
- `pytest-cov` - Code coverage reporting
- `pytest-aiohttp` - aiohttp testing utilities
- `pylint` - Code quality and linting
### Additional Testing Dependencies
- `requests` - For HTTP client testing
- `pyserial` - For RTU serial testing
- `pytz` - Timezone handling in tests
- `aiohttp` and `yarl` - Keep versions synchronized with main requirements
## Test Configuration
### pytest Configuration
- **Configuration File**: [tests/unit/python/.pytest.ini](mdc:tests/unit/python/.pytest.ini)
- **Minimum Version**: Check requirements-test.txt for current pytest version
- **Excluded Directories**: Plugin directories excluded from test recursion
- **Test Discovery**: Automatic discovery of test_*.py files
### Coverage Configuration
- **Configuration File**: [tests/unit/python/.coveragerc](mdc:tests/unit/python/.coveragerc)
- **Omitted Files**:
- `__init__.py` and `__template__.py` files
- Setup files and plugin directories
- Test directories themselves
- **Coverage Scope**: Focus on core Fledge components, exclude plugin frameworks
## Test Execution
### Basic pytest Commands
Refer to [tests/README.rst](mdc:tests/README.rst) for complete instructions:
```bash
# Execute all tests in specific file
pytest test_filename.py
# Execute specific test class
pytest test_filename.py::TestClass
# Execute specific test method
pytest test_filename.py::TestClass::test_case
# Verbose output with detailed information
pytest -s -vv
# Run tests with coverage
pytest --cov=. --cov-report=html
```
### Advanced Test Execution
```bash
# Run tests with full coverage report
pytest -s -vv tests/unit/python/fledge/ --cov=. --cov-report=html --cov-config tests/unit/python/.coveragerc
# Run tests with XML coverage for CI/CD
pytest --cov=. --cov-report html:coverage_html --cov-report xml:coverage.xml
# Run specific test patterns
pytest -k "test_pattern_name"
```
## Code Coverage
### Coverage Configuration
- **Tool**: pytest-cov framework integration
- **Config File**: [tests/unit/python/.coveragerc](mdc:tests/unit/python/.coveragerc)
- **Output Formats**: HTML, XML, and terminal reports
- **Exclusions**: Configured to omit template files, plugins, and test directories
### Coverage Commands
#### Basic Coverage Reports
```bash
# Terminal coverage report (default)
pytest --cov=. --cov-report=term
# Terminal with missing lines shown
pytest --cov=. --cov-report=term-missing
# HTML coverage report (recommended for development)
pytest --cov=. --cov-report=html
# JSON coverage report for tools integration
pytest --cov=. --cov-report=json
# XML coverage report for CI/CD systems
pytest --cov=. --cov-report=xml
```
#### Comprehensive Coverage Commands
```bash
# Full coverage with HTML and XML (for CI/CD)
pytest --cov=. --cov-report=html:coverage_html --cov-report=xml:coverage.xml --cov-config=tests/unit/python/.coveragerc
# Coverage with specific source directory and custom config
pytest tests/unit/python/fledge/ --cov=fledge --cov-report=html --cov-config=tests/unit/python/.coveragerc
# Coverage with minimum percentage threshold (fail if below)
pytest --cov=. --cov-report=term --cov-fail-under=80
# Coverage with detailed terminal output and HTML
pytest --cov=. --cov-report=term-missing --cov-report=html:htmlcov
# Coverage for specific modules only
pytest --cov=fledge.services.core --cov=fledge.common --cov-report=html
```
#### Coverage Report Analysis
```bash
# Generate coverage report after test run
coverage report
# Generate detailed HTML report
coverage html
# Show missing lines for specific file
coverage report --show-missing
# Coverage report with branch coverage
pytest --cov=. --cov-branch --cov-report=html
```
### Coverage Best Practices
#### Coverage Targets & Thresholds
- **Meaningful Coverage**: Aim for meaningful test coverage, not just high numbers
- **Minimum Thresholds**: Set reasonable minimum coverage (e.g., 80% for core modules)
- **Critical Paths**: Require higher coverage (90%+) for business logic and critical code paths
- **New Code**: Ensure new code has high test coverage before merging
- **Branch Coverage**: Include branch coverage for conditional logic testing
#### Coverage Configuration
- **Exclude Appropriately**: Use .coveragerc to exclude boilerplate and framework code
- **Include Patterns**: Focus coverage on source code, exclude tests and third-party code
- **Source Directories**: Specify source directories to avoid including test files in coverage
- **Precision**: Set appropriate precision for coverage reporting (e.g., 1 decimal place)
#### Coverage Monitoring & Reporting
- **Regular Monitoring**: Track coverage trends over time in CI/CD
- **Coverage Reports**: Generate reports for code review processes
- **Failed Builds**: Fail builds if coverage drops below threshold
- **Coverage Badges**: Display coverage status in repository README
- **Trend Analysis**: Monitor coverage changes across commits and releases
#### Coverage Quality Guidelines
- **Test Quality Over Quantity**: High coverage with poor tests is worse than lower coverage with good tests
- **Uncovered Code Review**: Regularly review uncovered code to determine if tests are needed
- **Coverage Gaps**: Identify and address significant coverage gaps in critical modules
- **Integration vs Unit**: Distinguish between unit test coverage and integration test coverage
- **Documentation**: Document rationale for excluding files from coverage
#### Coverage Anti-Patterns to Avoid
- **Coverage Gaming**: Writing tests just to increase coverage percentage
- **Shallow Testing**: Tests that call code but don't verify behavior
- **Ignoring Branches**: Only testing happy paths without error conditions
- **Over-Mocking**: Mocking so extensively that tests don't verify real behavior
- **Coverage-Only Metrics**: Using coverage as the only quality metric
#### Coverage Integration Examples
##### CI/CD Pipeline Integration
```bash
# In GitHub Actions, GitLab CI, etc.
pytest --cov=fledge --cov-report=xml --cov-report=html --cov-fail-under=80
```
##### Coverage with Multiple Output Formats
```bash
# Generate multiple report formats simultaneously
pytest --cov=. \
--cov-report=term-missing \
--cov-report=html:htmlcov \
--cov-report=xml:coverage.xml \
--cov-report=json:coverage.json \
--cov-fail-under=80
```
##### Coverage Configuration in pytest.ini
```ini
[tool:pytest]
addopts = --cov=fledge --cov-report=term-missing --cov-report=html --cov-fail-under=80
```
##### Coverage Badge Generation
```bash
# Generate coverage badge (requires coverage-badge package)
coverage-badge -o coverage.svg
```
## Unit Testing Best Practices
### Test Design Principles
- **Isolation**: Each test should be independent and not rely on other tests
- **Repeatability**: Tests should produce consistent results across runs
- **Fast Execution**: Keep unit tests fast for quick feedback loops (performance is not the focus, but speed aids development)
- **Clear Assertions**: Use descriptive assertion messages
- **Focused Scope**: Test one behavior per test method
- **Deterministic**: Tests should not rely on random data or external timing
- **Self-Contained**: Tests should set up their own data and clean up afterwards
### Mocking & Fixtures
- **External Dependencies**: Mock all external dependencies (databases, APIs, file system)
- **pytest-mock**: Use pytest-mock for integration with pytest fixtures
- **Fixture Scope**: Use appropriate fixture scopes (function, class, module, session)
- **Test Data**: Create reusable test data through fixtures
- **Cleanup**: Ensure proper cleanup of resources and mocks
### Async Testing
- **pytest-asyncio**: Use pytest-asyncio for testing async functions
- **Event Loops**: Properly handle event loop lifecycle in tests
- **Async Fixtures**: Use async fixtures for async setup/teardown
- **Timeout Handling**: Set appropriate timeouts for async operations
- **Mock Async**: Properly mock async functions and coroutines
### Error Testing
- **Exception Testing**: Test both success and failure scenarios
- **Error Messages**: Verify error messages and types
- **Edge Cases**: Test boundary conditions and edge cases
- **Input Validation**: Test invalid inputs and malformed data
- **Resource Exhaustion**: Test behavior under resource constraints
## Platform & Version Testing
### Python Version Compatibility
- **Target Versions**: Test across Python 3.8.10 through 3.12
- **Version-Specific**: Use version markers in requirements-test.txt for compatibility
- **CI/CD Integration**: Use matrices to validate multiple Python versions
- **Version Checks**: Use `sys.version_info` for version-specific test behavior
### Platform Testing Guidelines
- **Ubuntu Testing**: Primary development platform (LTS 20.04+)
- **Raspberry Pi**: ARM architecture testing for deployment compatibility
- **Cross-Architecture**: Validate functionality on x86_64, aarch64, and armv7l
- **Dependency Availability**: Ensure test dependencies install correctly across platforms
- **Functional Validation**: Focus on correctness, not performance characteristics
### Architecture-Specific Testing
- **x86_64**: Standard Ubuntu development and production
- **aarch64**: Ubuntu ARM64 and Raspberry Pi OS 64-bit
- **armv7l**: Raspberry Pi OS 32-bit
- **Dependencies**: Ensure test dependencies are available across platforms
- **Compatibility**: Verify unit tests pass consistently across architectures
- **Environment Differences**: Account for platform-specific behaviors in mocks and fixtures
================================================
FILE: .cursor/services/notification.mdc
================================================
# Fledge Notification Service - Feature Development Rules (MDC Format)
---
metadata:
version: "1.0.0"
last_updated: "2024-01-01"
author: "Fledge Development Team"
service: "notification-service"
language: "cpp"
framework: "custom"
license: "MIT"
---
## Configuration
### Development Environment
```yaml
development:
language: "cpp"
standard: "c++11"
compiler: "gcc-11"
build_system: "cmake"
testing_framework: "gtest"
linting: "clang-tidy"
formatting: "clang-format"
documentation: "doxygen"
```
### Project Structure
```yaml
project_structure:
root: "fledge-service-notification"
directories:
src:
- core/ # Core business logic
- api/ # API endpoints and handlers
- storage/ # Data persistence layer
- utils/ # Utility functions
- tests/ # Unit and integration tests
include: # Header files
docs: # Documentation
scripts: # Build and deployment scripts
config: # Configuration files
```
### Naming Conventions
```yaml
naming_conventions:
classes: "PascalCase"
methods: "camelCase"
member_variables: "m_camelCase"
constants: "UPPER_SNAKE_CASE"
namespaces: "lowercase"
files: "snake_case"
examples:
classes: ["NotificationManager", "EmailService"]
methods: ["sendNotification", "validateRecipient"]
member_variables: ["m_notificationQueue", "m_config"]
constants: ["MAX_RETRY_ATTEMPTS", "DEFAULT_TIMEOUT"]
```
## Development Rules
### Pre-Development Checklist
```yaml
pre_development_checklist:
architecture:
- "Review existing architecture and module boundaries"
- "Identify affected components and dependencies"
- "Plan integration points with existing services"
requirements:
- "Define clear acceptance criteria"
- "Consider backward compatibility requirements"
- "Plan error handling and edge cases"
observability:
- "Design logging and observability strategy"
- "Plan metrics collection"
- "Define monitoring alerts"
```
### Code Quality Standards
```yaml
code_quality:
complexity:
max_function_lines: 50
max_nesting_levels: 3
max_cyclomatic_complexity: 10
memory_management:
required: "raw_pointers"
thread_safety:
required: "mutex_protection"
patterns: ["lock_guard", "unique_lock", "atomic_operations"]
error_handling:
required: "exception_based"
forbidden: ["silent_failures", "error_ignoring"]
patterns: ["try_catch", "custom_exceptions", "error_logging"]
```
### C++ Development Standards
```yaml
cpp_standards:
memory_management:
preferred:
- "Notification* notification = new Notification()"
- "delete notification"
error_handling:
preferred:
- "class NotificationException : public std::runtime_error"
- "throw NotificationException(\"Invalid recipient: \" + recipient)"
patterns:
- "exception_based"
- "meaningful_error_messages"
- "proper_logging"
thread_safety:
required:
- "mutex_protection_for_shared_resources"
- "atomic_operations_where_appropriate"
patterns:
- "std::lock_guard<std::mutex> lock(m_mutex)"
- "std::atomic<int> counter"
```
### API Design Standards
```yaml
api_design:
restful_endpoints:
base_path: "/api/v1"
patterns:
- "GET /notifications"
- "POST /notifications"
- "GET /notifications/{id}"
- "PUT /notifications/{id}"
- "DELETE /notifications/{id}"
request_models:
required_fields:
- "recipient"
- "subject"
- "message"
- "type"
optional_fields:
- "templateId"
- "metadata"
validation:
- "recipient_format"
- "message_length"
- "type_enumeration"
response_models:
standard_fields:
- "id"
- "status"
- "createdAt"
- "updatedAt"
error_response:
- "error_code"
- "error_message"
- "timestamp"
```
### Testing Standards
```yaml
testing_standards:
unit_tests:
required:
- "success_paths"
- "failure_paths"
- "edge_cases"
- "boundary_conditions"
patterns:
- "Arrange-Act-Assert"
- "Given-When-Then"
naming: "MethodName_Scenario_ExpectedResult"
integration_tests:
required:
- "end_to_end_flows"
- "api_endpoints"
- "database_operations"
patterns:
- "TestHttpClient"
- "TestDatabase"
- "MockServices"
test_coverage:
minimum: 80
critical_paths: 100
new_features: 90
```
### Logging and Observability
```yaml
logging_standards:
levels:
- "TRACE"
- "DEBUG"
- "INFO"
- "WARN"
- "ERROR"
- "FATAL"
structured_logging:
required_fields:
- "timestamp"
- "level"
- "service"
- "operation"
optional_fields:
- "request_id"
- "user_id"
- "duration"
- "metadata"
sensitive_data:
forbidden_in_logs:
- "passwords"
- "api_keys"
- "personal_identifiers"
- "credit_card_numbers"
redaction_patterns:
- "password=***"
- "key=***"
```
### Security Standards
```yaml
security_standards:
input_validation:
required:
- "recipient_format"
- "message_length"
- "type_enumeration"
- "sql_injection_prevention"
patterns:
- "whitelist_validation"
- "regex_validation"
- "length_limits"
authentication:
required:
- "token_validation"
- "permission_checks"
- "session_management"
patterns:
- "JWT_tokens"
- "OAuth2"
- "API_keys"
authorization:
required:
- "role_based_access"
- "resource_permissions"
- "audit_logging"
patterns:
- "RBAC"
- "ABAC"
- "Permission_matrix"
```
### Performance Guidelines
```yaml
performance_guidelines:
memory_management:
preferred:
- "RAII_principles"
- "smart_pointers"
- "move_semantics"
avoid:
- "unnecessary_copies"
- "memory_leaks"
- "fragmentation"
async_processing:
patterns:
- "thread_pools"
- "async_await"
- "future_promise"
use_cases:
- "notification_sending"
- "batch_processing"
- "external_api_calls"
caching:
strategies:
- "in_memory_cache"
- "distributed_cache"
- "cache_invalidation"
patterns:
- "LRU_cache"
- "TTL_expiration"
- "cache_warming"
```
### Configuration Management
```yaml
configuration_management:
structure:
required_sections:
- "database"
- "email"
- "logging"
- "security"
optional_sections:
- "caching"
- "monitoring"
- "external_services"
validation:
required:
- "type_safety"
- "value_ranges"
- "required_fields"
patterns:
- "schema_validation"
- "environment_validation"
- "dependency_validation"
environment_specific:
development:
- "debug_logging"
- "mock_services"
- "local_database"
production:
- "error_logging_only"
- "real_services"
- "clustered_database"
```
### Documentation Standards
```yaml
documentation_standards:
code_documentation:
required:
- "public_apis"
- "complex_algorithms"
- "business_logic"
format: "doxygen"
tags:
- "@brief"
- "@param"
- "@return"
- "@throws"
- "@example"
api_documentation:
required:
- "endpoint_descriptions"
- "request_response_examples"
- "error_codes"
format: "OpenAPI_3.0"
deployment_documentation:
required:
- "build_instructions"
- "deployment_steps"
- "configuration_guide"
- "troubleshooting"
```
### Deployment and DevOps
```yaml
deployment_standards:
build_system:
tool: "cmake"
minimum_version: "3.16"
cpp_standard: "17"
dependencies:
- "gtest"
- "spdlog"
- "nlohmann_json"
containerization:
base_image: "gcc:11"
runtime_image: "debian:bullseye-slim"
multi_stage: true
security_scanning: true
ci_cd:
required_stages:
- "build"
- "test"
- "lint"
- "security_scan"
- "deploy"
quality_gates:
- "test_coverage >= 80%"
- "no_critical_vulnerabilities"
- "build_success"
```
## Code Review Checklist
### Architecture & Design
```yaml
architecture_checklist:
- "Code follows established architectural patterns"
- "No unnecessary coupling between modules"
- "Clear separation of concerns"
- "Proper use of inheritance vs composition"
- "Module boundaries respected"
```
### Code Quality
```yaml
code_quality_checklist:
- "All functions are under 50 lines"
- "No more than 4 levels of nesting"
- "No code duplication (DRY principle)"
- "Meaningful variable and function names"
- "Consistent coding style"
- "No magic numbers without constants"
```
### Testing
```yaml
testing_checklist:
- "Unit tests cover all new functionality"
- "Integration tests for API endpoints"
- "Edge cases and error conditions tested"
- "Test names clearly describe behavior"
- "Mock objects used appropriately"
- "Test coverage meets minimum requirements"
```
### Security
```yaml
security_checklist:
- "Input validation implemented"
- "Authentication/authorization checks"
- "No sensitive data in logs"
- "Secure error handling"
- "No SQL injection vulnerabilities"
- "Proper secrets management"
```
### Performance
```yaml
performance_checklist:
- "No N+1 query patterns"
- "Efficient algorithms used"
- "Memory management follows RAII"
- "Async operations where appropriate"
- "No blocking operations in hot paths"
- "Resource cleanup implemented"
```
### Documentation
```yaml
documentation_checklist:
- "Public APIs documented with Doxygen"
- "README updated if needed"
- "Code comments explain 'why' not 'what'"
- "Configuration documented"
- "Deployment instructions updated"
- "API documentation current"
```
## Anti-Patterns
### Memory Management Anti-Patterns
```yaml
memory_anti_patterns:
- "Missing cleanup in destructors"
- "Resource leaks in error paths"
- "Improper ownership semantics"
```
### Thread Safety Anti-Patterns
```yaml
thread_safety_anti_patterns:
- "Shared mutable state without protection"
- "Missing mutex locks"
- "Race conditions in concurrent access"
- "Improper atomic operation usage"
- "Deadlock scenarios"
```
### Error Handling Anti-Patterns
```yaml
error_handling_anti_patterns:
- "Silent failures"
- "Catching all exceptions without handling"
- "Incomplete error recovery"
- "Insufficient error logging"
- "Error swallowing"
```
### Performance Anti-Patterns
```yaml
performance_anti_patterns:
- "Unnecessary object copying"
- "Inefficient algorithms"
- "Blocking operations in hot paths"
- "Memory allocation in performance-critical code"
- "N+1 query patterns"
```
## Feature Development Template
### Template Structure
```yaml
feature_template:
interface_definition:
- "Define the feature interface"
- "Specify public API methods"
- "Document method signatures"
implementation:
- "Implement the feature class"
- "Add proper error handling"
- "Include logging and metrics"
- "Follow thread safety patterns"
testing:
- "Create unit tests"
- "Add integration tests"
- "Test edge cases"
- "Verify error conditions"
documentation:
- "Document public APIs"
- "Add usage examples"
- "Update README if needed"
- "Include configuration docs"
```
### Template Code Structure
```yaml
template_code:
header_file: "include/[FeatureName]Service.h"
implementation_file: "src/core/[FeatureName]Service.cpp"
test_file: "src/tests/[FeatureName]ServiceTest.cpp"
documentation_file: "docs/[FeatureName]Service.md"
class_structure:
- "Public interface methods"
- "Private helper methods"
- "Member variables"
- "Constructor and destructor"
test_structure:
- "Setup and teardown"
- "Success path tests"
- "Failure path tests"
- "Edge case tests"
```
## Validation Rules
### Code Validation
```yaml
code_validation:
static_analysis:
- "clang-tidy"
- "cppcheck"
- "sonarqube"
dynamic_analysis:
- "valgrind"
- "asan"
- "tsan"
style_checking:
- "clang-format"
- "cpplint"
- "custom_style_rules"
```
### Test Validation
```yaml
test_validation:
coverage_requirements:
line_coverage: 80
branch_coverage: 70
function_coverage: 90
test_quality:
- "No flaky tests"
- "Fast execution"
- "Clear assertions"
- "Proper mocking"
```
### Security Validation
```yaml
security_validation:
static_analysis:
- "semgrep"
- "bandit"
- "custom_security_rules"
dependency_checking:
- "safety"
- "snyk"
- "vulnerability_scanning"
```
## Compliance
### Standards Compliance
```yaml
compliance:
coding_standards:
- "C++11 standard"
- "MISRA C++ guidelines"
- "Google C++ Style Guide"
- "Project-specific conventions"
security_standards:
- "OWASP guidelines"
- "CWE/SANS Top 25"
- "Industry best practices"
performance_standards:
- "Response time requirements"
- "Throughput requirements"
- "Resource utilization limits"
```
### Quality Gates
```yaml
quality_gates:
build:
- "Successful compilation"
- "No warnings"
- "Static analysis passed"
test:
- "All tests passing"
- "Coverage requirements met"
- "No flaky tests"
security:
- "No critical vulnerabilities"
- "Security scan passed"
- "Dependency audit clean"
performance:
- "Performance benchmarks passed"
- "Memory usage within limits"
- "Response time requirements met"
```
---
# End of MDC Configuration
description:
globs:
alwaysApply: false
---
================================================
FILE: .cursor/services/notification_code_review.mdc
================================================
---
description:
globs:
alwaysApply: true
---
# Fledge Notification Service - Multi-Document Context (MDC)
### Project Overview
This MDC file contains comprehensive rules, guidelines, and documentation for AI-assisted development and code review in the Fledge Notification Service project. It combines code review evaluation criteria, git diff analysis techniques, and project-specific standards.
---
## 1. Code Review Evaluation Criteria
### 1.1 Design & Architecture
- Verify the change fits your system's architectural patterns
- Avoid unnecessary coupling or speculative features
- Enforce clear separation of concerns
- Align with defined module boundaries
- Check for proper inheritance vs composition decisions
### 1.2 Complexity & Maintainability
- Ensure control flow remains flat
- Keep cyclomatic complexity low
- Abstract duplicate logic (DRY principle)
- Remove dead or unreachable code
- Refactor dense logic into testable helper methods
- Break down complex methods into smaller, focused functions
### 1.3 Functionality & Correctness
- Confirm new code paths behave correctly under valid and invalid inputs
- Cover all edge cases
- Maintain idempotency for retry-safe operations
- Satisfy all functional requirements or user stories
- Include robust error-handling semantics
- Validate input parameters and configuration
### 1.4 Readability & Naming
- Check that identifiers clearly convey intent
- Comments should explain *why* (not *what*)
- Code blocks should be logically ordered
- No surprising side-effects hide behind deceptively simple names
- Use consistent naming conventions
### 1.5 Best Practices & Patterns
- Validate use of language- or framework-specific idioms
- Adhere to SOLID principles
- Ensure proper resource cleanup
- Maintain consistent logging/tracing
- Clear separation of responsibilities across layers
- Use RAII and smart pointers for memory management
### 1.6 Test Coverage & Quality
- Verify unit tests for both success and failure paths
- Include integration tests exercising end-to-end flows
- Use appropriate mocks/stubs
- Include meaningful assertions (including edge-case inputs)
- Test names should accurately describe behavior
### 1.7 Standardization & Style
- Ensure conformance to style guides (indentation, import/order, naming conventions)
- Maintain consistent project structure (folder/file placement)
- Zero new linter or formatter warnings
- Follow C++11 standards and project conventions
### 1.8 Documentation & Comments
- Confirm public APIs or complex algorithms have clear in-code documentation
- Update README, Swagger/OpenAPI, CHANGELOG, or other user-facing docs
- Use Doxygen-style comments for all public APIs
- Include `@brief`, `@param`, `@return`, `@throws` tags
### 1.9 Security & Compliance
- Check input validation and sanitization against injection attacks
- Ensure proper output encoding
- Implement secure error handling
- Check dependency license and vulnerability checks
- Follow secrets management best practices
- Enforce authZ/authN where applicable
### 1.10 Performance & Scalability
- Identify N+1 query patterns or inefficient I/O
- Check memory management concerns
- Avoid heavy hot-path computations
- Consider caching, batching, memoization, async patterns
- Optimize algorithms where necessary
### 1.11 Observability & Logging
- Verify that key events emit metrics or tracing spans
- Use appropriate log levels
- Redact sensitive data
- Include contextual information for monitoring and debugging
- Support post-mortem analysis
### 1.12 CI/CD & DevOps
- Validate build pipeline integrity
- Ensure automated test gating
- Check artifact creation
- Verify dependency declarations
- Follow organizational DevOps best practices
---
## 2. C++ Specific Standards
### 2.1 Naming Conventions
- **Classes**: PascalCase (e.g., `NotificationManager`)
- **Methods**: camelCase (e.g., `setupFilterPipeline()`)
- **Member variables**: m_camelCase (e.g., `m_filterPipeline`)
- **Constants**: UPPER_SNAKE_CASE (e.g., `DEFAULT_RETRIGGER_TIME`)
- **Namespaces**: lowercase (e.g., `std`)
### 2.2 Memory Management
- Follow RAII principles
- Avoid manual memory management where possible
- Ensure proper cleanup in destructors
### 2.3 Error Handling
- Use exceptions for exceptional conditions
- Log errors with appropriate log levels
- Provide meaningful error messages
- Handle resource failures gracefully
### 2.4 Thread Safety
- Use mutex for shared resource protection
- Consider atomic operations where appropriate
- Document thread safety guarantees
- Avoid race conditions in concurrent code
---
## 3. Git Diff Analysis Techniques
### 3.1 Understanding Git Diff Commands
```bash
# Show file names only
git diff --name-only origin/develop...origin/feature-branch
# Show statistics
git diff --stat origin/develop...origin/feature-branch
# Show detailed statistics
git diff --numstat origin/develop...origin/feature-branch
# Show short statistics
git diff --shortstat origin/develop...origin/feature-branch
# Show word-level changes
git diff --word-diff origin/develop...origin/feature-branch
# Show context with more lines
git diff -U10 origin/develop...origin/feature-branch
```
### 3.2 Diff Output Interpretation
#### File Statistics Analysis
```bash
git diff --numstat origin/develop...origin/feature-branch
```
Output format: `[insertions] [deletions] [filename]`
#### Change Pattern Recognition
- **High insertion count**: New functionality or major refactoring
- **High deletion count**: Code cleanup or breaking changes
- **Balanced changes**: Refactoring or feature updates
- **Low net change**: Bug fixes or minor improvements
### 3.3 Three-Way Merge Analysis
```bash
# Compare two branches
git diff branch1...branch2
# Compare with common ancestor
git diff branch1..branch2
```
### 3.4 Change Impact Assessment
#### File-Level Analysis
1. **Header Files**: Interface changes, new dependencies
2. **Source Files**: Implementation changes, new functionality
3. **Test Files**: Test coverage, validation logic
4. **Configuration Files**: Settings, defaults, options
#### Line-Level Analysis
1. **Additions (+)**: New code, features, methods
2. **Deletions (-)**: Removed code, cleanup, breaking changes
3. **Context**: Surrounding code for understanding changes
### 3.5 Pattern Recognition in Diffs
#### Common Patterns
1. **New Includes**: `#include <new_header.h>`
2. **Method Signatures**: Parameter changes, return type changes
3. **Class Inheritance**: `class X : public Y`
4. **Member Variables**: `Type* m_variable;`
5. **Configuration**: JSON structures, default values
#### Red Flags in Diffs
1. **Manual Memory Management**: `new`/`delete` without smart pointers
2. **Missing Error Handling**: No try-catch blocks
3. **Inconsistent Naming**: Mixed naming conventions
4. **Large Methods**: Methods with many lines added
5. **Missing Documentation**: New methods without comments
---
## 4. Issue Severity Levels
### 4.1 Critical
- Memory leaks or resource leaks
- Race conditions or thread safety issues
- Security vulnerabilities
- Data corruption risks
- Build failures or compilation errors
### 4.2 Major
- Performance issues affecting scalability
- Architectural violations
- Missing error handling
- Incomplete functionality
- Breaking changes without proper migration
### 4.3 Minor
- Code style violations
- Missing documentation
- Inefficient algorithms
- Code duplication
- Minor bugs with workarounds
### 4.4 Enhancement
- Missing test coverage
- Performance optimizations
- Code refactoring opportunities
- Additional features or improvements
- Better error messages or logging
---
## 5. Code Review Process
### 5.1 High-Level Summary
Describe product impact and engineering approach in 2-3 sentences:
- **Product impact**: What does this change deliver for users or customers?
- **Engineering approach**: Key patterns, frameworks, or best practices in use
### 5.2 Fetch and Scope the Diff
1. Run `git fetch origin` to ensure latest code
2. Compute `git diff --name-only --diff-filter=M origin/develop...origin/feature-branch`
3. For each file, run `git diff --quiet origin/develop...origin/feature-branch -- <file>`
4. Skip files that produce no actual diff hunks
### 5.3 Evaluate Against Criteria
For each truly changed file and each diffed hunk, evaluate against the 12 evaluation criteria listed above.
### 5.4 Report Issues
For each validated issue, output a nested bullet like this:
- File: `<path>:<line-range>`
- Issue: [One-line summary of the root problem]
- Fix: [Concise suggested change or code snippet]
### 5.5 Prioritize Issues
Group issues by severity in this order:
- Critical
- Major
- Minor
- Enhancement
### 5.6 Highlight Positives
Include a brief bulleted list of positive findings or well-implemented patterns observed in the diff.
---
## 6. Common Issues to Watch For
### 6.1 Memory Management
- Manual `new`/`delete` without smart pointers
- Missing cleanup in destructors
- Resource leaks in error paths
- Improper ownership semantics
### 6.2 Thread Safety
- Shared mutable state without protection
- Missing mutex locks
- Race conditions in concurrent access
- Improper atomic operation usage
### 6.3 Error Handling
- Missing exception handling
- Incomplete error recovery
- Silent failures
- Insufficient error logging
### 6.4 Performance
- Unnecessary object copying
- Inefficient algorithms
- Blocking operations in hot paths
- Memory allocation in performance-critical code
### 6.5 Code Quality
- Code duplication
- Complex methods (>50 lines)
- Deep nesting (>4 levels)
- Magic numbers without constants
- Inconsistent naming
---
## 7. Positive Patterns to Recognize
- Proper use of RAII and smart pointers
- Clear separation of concerns
- Comprehensive error handling
- Good logging and observability
- Consistent coding style
- Thorough documentation
- Appropriate test coverage
- Performance-conscious design
- Thread-safe implementations
- Backward compatibility maintenance
---
## 8. Advanced Git Commands for Analysis
```bash
# Show only function changes
git diff -p origin/develop...origin/feature-branch | grep -A 5 -B 5 "^[+-].*("
# Show only structural changes
git diff --stat --summary origin/develop...origin/feature-branch
# Show changes with context
git diff -U5 origin/develop...origin/feature-branch
# Show only additions
git diff --diff-filter=A origin/develop...origin/feature-branch
# Show only deletions
git diff --diff-filter=D origin/develop...origin/feature-branch
# Show only modifications
git diff --diff-filter=M origin/develop...origin/feature-branch
# Count lines by type
git diff origin/develop...origin/feature-branch | grep -c "^+"
git diff origin/develop...origin/feature-branch | grep -c "^-"
# Find new includes
git diff origin/develop...origin/feature-branch | grep "^+#include"
# Find new class definitions
git diff origin/develop...origin/feature-branch | grep "^+class"
# Find new method definitions
git diff origin/develop...origin/feature-branch | grep "^+.*("
```
---
## 9. Fledge-Specific Guidelines
### 9.1 Notification Service Architecture
- Follow existing notification patterns and conventions
- Maintain backward compatibility with existing configurations
- Use proper plugin architecture for extensibility
- Implement proper resource cleanup for notification instances
### 9.2 Filter Pipeline Integration
- Ensure thread-safe filter pipeline operations
- Implement proper error handling for filter setup
- Use smart pointers for filter pipeline management
- Add comprehensive logging for filter operations
### 9.3 Configuration Management
- Follow Fledge configuration patterns
- Implement proper category registration/unregistration
- Handle configuration changes gracefully
- Validate configuration parameters
### 9.4 Testing Requirements
- Unit tests for all new functionality
- Integration tests for filter pipeline workflows
- Performance tests for large datasets
- Error condition testing
---
## 10. AI-Assisted Development Guidelines
### 10.1 Code Generation
- Follow established naming conventions
- Include proper error handling
- Add comprehensive documentation
- Ensure thread safety where applicable
### 10.2 Code Review Assistance
- Analyze git diffs systematically
- Identify potential issues early
- Suggest improvements and optimizations
- Maintain consistency with existing codebase
### 10.3 Documentation Generation
- Create clear, concise documentation
- Include examples and usage patterns
- Document API changes and breaking changes
- Maintain up-to-date README files
### 10.4 Testing Assistance
- Generate comprehensive test cases
- Include edge case testing
- Ensure proper test coverage
- Create integration test scenarios
---
## 11. Project-Specific Rules
### 11.1 File Organization
- Keep header files in `include/` directories
- Organize source files logically
- Maintain consistent file naming
- Group related functionality together
### 11.2 Build System
- Follow CMake conventions
- Maintain proper dependency management
- Ensure cross-platform compatibility
- Include proper version information
### 11.3 Version Control
- Use meaningful commit messages
- Create feature branches for new development
- Maintain clean git history
- Follow branching strategies
### 11.4 Code Quality
- Pass all linting checks
- Maintain consistent formatting
- Follow coding standards
- Include proper comments
---
This MDC file serves as a comprehensive guide for AI-assisted development and code review in the Fledge Notification Service project. It provides structured evaluation criteria, git diff analysis techniques, and project-specific guidelines to ensure high-quality code development and review processes.
description:
globs:
alwaysApply: false
---
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: "🐛 Bug Report"
description: Create a new ticket for a bug.
title: "🐛 [BUG] - <title>"
labels: ["bug"]
assignees: Mark Riddoch
body:
- type: markdown
attributes:
value: |
### Please read, before you post!
This is a **BUG REPORT for issues in the existing code**.
If you have general questions, code handling problems, or ideas, please use the:
- Discussion-board: https://github.com/fledge-iot/fledge/discussions
- Slack-Channel: Use the fledge or fledge-help Slack Channel on https://slack.lfedge.org
Verify first that your issue is not already reported on https://github.com/fledge-iot/fledge/issues
---
- type: textarea
id: description
attributes:
label: "Description"
description: Please enter an explicit description of your issue
placeholder: Short and explicit description of your incident...
validations:
required: true
- type: input
id: platform
attributes:
label: "Environment Platform"
description: Please enter the environment details
placeholder: Information about the system or platform (e.g., OS, version, architecture).
validations:
required: true
- type: input
id: version
attributes:
label: "Fledge Version"
description: Please enter the version details
placeholder: The specific version of fledge you are using.
validations:
required: true
- type: dropdown
id: installation-method
attributes:
label: "Installation"
description: Fledge installation via
options:
- Source Code
- Package based
- Docker Container
validations:
required: true
- type: textarea
id: reprod
attributes:
label: "Steps To Reproduce"
description: Please enter an explicit description of your issue
value: |
1.
2.
3.
4. See error
render: bash
validations:
required: true
- type: textarea
id: behavior
attributes:
label: "Expected Behavior"
description: A clear and concise description of what you expected to happen.
validations:
required: true
- type: textarea
id: screenshot
attributes:
label: "Screenshots"
description: If applicable, add screenshots to help explain your problem.
validations:
required: false
- type: textarea
id: logs
attributes:
label: "Logs"
description: Please copy and paste any relevant log (i.e syslogs) output. This will be automatically formatted into code, so no need for backticks.
render: bash
validations:
required: false
- type: textarea
id: support-bundle
attributes:
label: "Support bundle"
description: Please share the support bundle. It would be highly appreciated, as it is essential for further troubleshooting.
placeholder: Use the Fledge GUI interface to collect the support bundle. Navigate to the left menu, select the 'Support' menu item, click on 'Request New,' and then download the bundle.
validations:
required: true
- type: markdown
attributes:
value: |
#### Thank you for taking the time to file a bug report! Your bug request will be reviewed by the team.
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
================================================
FILE: .github/ISSUE_TEMPLATE/doc_issue.yml
================================================
name: "📝 Report a documentation issue"
description: "Is something wrong, confusing or missing in the docs?"
labels: ["documentation"]
assignees: Mark Riddoch
body:
- type: input
id: version
attributes:
label: "Version"
description: Please enter the version from https://fledge-iot.readthedocs.io
placeholder: Obtain information about the version (e.g., latest, nightly)
validations:
required: true
- type: textarea
id: describe-issue
attributes:
label: "Describe the documentation issue"
validations:
required: true
- type: textarea
id: what-solution
attributes:
label: "What solution would you like to see?"
validations:
required: true
- type: markdown
attributes:
value: |
#### Thank you for taking the time to file a docs issue report! Your request will be reviewed by the team.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: "💡 Feature Request"
description: Create a new ticket for a new feature request
title: "💡 [REQUEST] - <title>"
labels: ["question"]
assignees: Mark Riddoch
body:
- type: textarea
id: summary
attributes:
label: "Summary"
description: Provide a brief explanation of the feature
placeholder: Describe in a few lines your feature request
validations:
required: true
- type: textarea
id: basic_example
attributes:
label: "Basic Example"
description: Indicate here some basic examples of your feature.
placeholder: A few specific words about your feature request.
validations:
required: true
- type: textarea
id: drawbacks
attributes:
label: "Drawbacks"
description: What are the drawbacks/impacts of your feature request?
placeholder: Identify the drawbacks and impacts while being neutral on your feature request
validations:
required: true
- type: textarea
id: unresolved_question
attributes:
label: "Unresolved questions"
description: What questions still remain unresolved?
placeholder: Identify any unresolved issues.
validations:
required: false
- type: textarea
id: implementation_pr
attributes:
label: "Implementation PR"
description: Pull request used
placeholder: "#Pull Request ID"
validations:
required: false
- type: textarea
id: reference_issues
attributes:
label: "Reference Issues"
description: Common issues
placeholder: "#Issues IDs"
validations:
required: false
- type: markdown
attributes:
value: |
#### Thank you for helping us improve the project! Your feature request will be reviewed by the team.
================================================
FILE: .github/workflows/checker.yml
================================================
name: Checker
on:
push:
branches: ['**']
jobs:
test:
name: 🛠️ Build on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-22.04, ubuntu-24.04]
env:
FLEDGE_ROOT: ${{ github.workspace }}
PYTHONPATH: ${{ github.workspace }}/python
steps:
- name: 🛎️ Checkout code
uses: actions/checkout@v4
- name: ⚙️ Compile Fledge Core
id: make_fledge
run: |
set -e
echo "⚠️ APT is misinterpreting the mirror+file: scheme as a URL 🌐, causing 404 errors ❌ due to a missing or invalid /etc/apt/apt-mirrors.txt file 📄."
RELEASE=$(lsb_release -cs)
echo "Using release: $RELEASE"
cat <<EOF | sudo tee /etc/apt/sources.list
deb http://archive.ubuntu.com/ubuntu $RELEASE main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu $RELEASE-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu $RELEASE-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu $RELEASE-security main restricted universe multiverse
EOF
sudo apt-get update
sudo apt-get install -y --fix-missing
echo "🔧 Run setup prerequisites 📦 and compilation of code 🛠️"
cd "$FLEDGE_ROOT"
sudo ./requirements.sh
make -j"$(nproc)"
- name: 🧪 Run C Unit Tests
if: steps.make_fledge.outcome == 'success'
continue-on-error: true
run: |
set +e
cd "$FLEDGE_ROOT/tests/unit/C"
echo "🛠️ Installing C test dependencies..."
chmod +x requirements.sh && ./requirements.sh
echo "📋 Running C tests..."
chmod +x scripts/RunAllTests.sh && ./scripts/RunAllTests.sh
mkdir -p "$FLEDGE_ROOT/reports"
cp -v results/*.xml "$FLEDGE_ROOT/reports/" || echo "⚠️ No C test reports found"
- name: 🧪 Run Python Unit Tests
if: steps.make_fledge.outcome == 'success'
continue-on-error: true
run: |
set +e
echo "🛠️ Installing Python test dependencies..."
python3 -m pip install -Ir python/requirements-test.txt
echo "📋 Running Python tests..."
python3 -m pytest -s -vv \
--junit-xml="$FLEDGE_ROOT/tests/unit/python/fledge/python_test_output.xml" \
"$FLEDGE_ROOT/tests/unit/python/fledge" \
--tb=line
mkdir -p "$FLEDGE_ROOT/reports"
cp -v "$FLEDGE_ROOT/tests/unit/python/fledge/"*.xml "$FLEDGE_ROOT/reports/" || echo "⚠️ No Python test report found"
# Publish test results to GitHub UI using a third-party action
# Note: GitHub Actions does not yet support native test report publishing in the UI
# This step uses dorny/test-reporter to visualize test results in the Actions tab
- name: 📤 Publish Test Report to GitHub
if: steps.make_fledge.outcome == 'success'
continue-on-error: true
uses: dorny/test-reporter@v1
with:
name: 📊 Test Results on ${{ matrix.os }}
path: ${{ env.FLEDGE_ROOT }}/reports/*.xml
reporter: java-junit
fail-on-error: true
================================================
FILE: .gitignore
================================================
# vi
*.swp
# MacOS Finder
.DS_Store
._*
# IDE
*.idea
.vscode/
# Data / cache files
data/etc/storage.json
data/etc/sqlite.json
data/etc/sqlitelb.json
data/etc/certs/*
data/var
data/support
data/scripts
data/plugins
data/snapshots
data/logs
data/configure_repo_output.txt
# SQLite3 default db location and after migration
data/*.db
data/*.db-wal
data/*.db-shm
data/*.db-journal
scripts/extras/*.db
/etc/storage.json
/etc/certs/*
storage.json
# Docs
docs/_build
docs/__pycache__/
docs/.cache/
docs/plugins
docs/services
docs/fledge_plugins.rst
# Compiled Object files
*.pyc
# build specific
/C/plugins/storage/build
/C/services/storage/build
/cmake_build
/plugins
/python_build_dir
/services
/tasks
# Error Logs
*.err
# Test files
*.result
*.temp
# Keys and certificates
*.cert
*.csr
*.key
*.cer
*.crt
.cache/
# Backup
data/backup
data/etc/backup_postgres_configuration_cache.json
# test
.pytest_cache
.coverage
# Async ingest pymodule
python/async_ingest.so*
# Filter ingest pymodule
python/filter_ingest.so*
# Python south & filter plugins
python/fledge/plugins/south/*
python/fledge/plugins/filter/*
python/fledge/plugins/notificationDelivery/*
python/fledge/plugins/notificationRule/*
# doxygen build
doxy/
# aspell backups
*.bak
tests/unit/C/build
tests/unit/C/lib
tests/unit/C/*/build
================================================
FILE: .readthedocs.yaml
================================================
# Read the Docs configuration file for Sphinx projects
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
# Required
version: 2
# Set the OS, Python version and other tools you might need
build:
os: ubuntu-20.04
tools:
python: "3.8"
# You can also specify other tool versions:
# nodejs: "20"
# rust: "1.70"
# golang: "1.20"
# Build documentation in the "docs/" directory with Sphinx
sphinx:
configuration: docs/conf.py
# You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs
# builder: "dirhtml"
# Fail on all warnings to avoid broken references
# fail_on_warning: true
# Optionally build your docs in additional formats such as PDF and ePub
# formats:
# - pdf
# - epub
# Optional but recommended, declare the Python requirements required
# to build your documentation
# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
python:
install:
- requirements: docs/requirements.txt
================================================
FILE: ADOPTERS.MD
================================================
# Fledge Adopters
- Beckhoff - PLC Vendor
- Dianomic - IIoT Software
- Flir - IR/Gas Cameras
- General Atomics - Predator Drone
- Google - Search-ML-Cloud-TPUs
- JEA - Energy/Water Company
- [Motorsports.ai](http://motorsports.ai/) - Racing Digital Twins
- Nexcom - Industrial Gateways
- Nokia - Wireless Communications
- OSIsoft - Data Infrastructure
- Rovisys - Industrial SI
- Transpara - HMI for Process Manufacturers
- Wago - PLC Vendor
- Zededa - VMs for IoT
- RTE France - T&D
- Nueman Aluminium
================================================
FILE: C/common/CMakeLists.txt
================================================
cmake_minimum_required(VERSION 2.4.0)
if(COMMAND cmake_policy)
cmake_policy(SET CMP0003 NEW)
endif(COMMAND cmake_policy)
# Get the os name
execute_process(COMMAND bash -c "cat /etc/os-release | grep -w ID | cut -f2 -d'='"
OUTPUT_VARIABLE
OS_NAME
OUTPUT_STRIP_TRAILING_WHITESPACE)
if( POLICY CMP0007 )
cmake_policy( SET CMP0007 NEW )
endif()
project(common-lib)
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(UUIDLIB -luuid)
set(BOOST_COMPONENTS system thread)
# Late 2017 TODO: remove the following checks and always use std::regex
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)
set(BOOST_COMPONENTS ${BOOST_COMPONENTS} regex)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_BOOST_REGEX")
endif()
endif()
find_package(Boost 1.53.0 COMPONENTS ${BOOST_COMPONENTS} REQUIRED)
include_directories(SYSTEM ${Boost_INCLUDE_DIR})
# Find python3.x dev/lib package
find_package(PkgConfig REQUIRED)
if(${CMAKE_VERSION} VERSION_LESS "3.12.0")
pkg_check_modules(PYTHON REQUIRED python3)
else()
find_package(Python3 REQUIRED COMPONENTS Interpreter Development NumPy)
endif()
# Find source files
file(GLOB SOURCES *.cpp)
# Include header files
include_directories(include ../services/common/include ../common/include ../thirdparty/rapidjson/include ../thirdparty/Simple-Web-Server)
# Add Python 3.x header files
if(${CMAKE_VERSION} VERSION_LESS "3.12.0")
include_directories(${PYTHON_INCLUDE_DIRS})
else()
include_directories(${Python3_INCLUDE_DIRS} ${Python3_NUMPY_INCLUDE_DIRS})
endif()
if(${CMAKE_VERSION} VERSION_LESS "3.12.0")
link_directories(${PYTHON_LIBRARY_DIRS})
else()
link_directories(${Python3_LIBRARY_DIRS})
endif()
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/../lib)
# Create shared library
add_library(${PROJECT_NAME} SHARED ${SOURCES})
# Add Python 3.5 library
if(${CMAKE_VERSION} VERSION_LESS "3.12.0")
target_link_libraries(${PROJECT_NAME} ${PYTHON_LIBRARIES})
else()
target_link_libraries(${PROJECT_NAME} ${Python3_LIBRARIES} Python3::NumPy)
endif()
target_link_libraries(${PROJECT_NAME} ${UUIDLIB})
target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES})
target_link_libraries(${PROJECT_NAME} -lcrypto)
set_target_properties(${PROJECT_NAME} PROPERTIES SOVERSION 1)
# Install library
install(TARGETS ${PROJECT_NAME} DESTINATION fledge/lib)
================================================
FILE: C/common/JSONPath.cpp
================================================
/*
* Fledge RapaidJSON JSONPath search helper
*
* Copyright (c) 2020 Dianomic Systems
*
* Released under the Apache 2.0 Licence
*
* Author: Mark Riddoch
*/
#include <JSONPath.h>
#include <logger.h>
#include <cstring>
#include <stdexcept>
using namespace std;
using namespace rapidjson;
JSONPath::JSONPath(const string& path) : m_path(path)
{
m_logger = Logger::getLogger();
}
/**
* Destructor for the JSONPath
*
* Reclaim the vector of components.
*/
JSONPath::~JSONPath()
{
for (int i = 0; i < m_parsed.size(); i++)
{
delete m_parsed[i];
}
}
/**
* Find the matching node in the JSON document
*
* param node The node to search from
* @return the matching node. Throws an exception if there was no match
*/
Value *JSONPath::findNode(Value& root)
{
if (m_parsed.size() == 0)
{
parse();
}
Value *node = &root;
for (int i = 0; i < m_parsed.size(); i++)
{
node = m_parsed[i]->match(node);
}
return node;
}
/**
* Parse the m_path JSON path. Throws an exception if there
* was a parse error.
*
* The supported elements are
* Literal object name /a
* Array Index a[1]
* Array with matching predicate a[name==value]
*/
void JSONPath::parse()
{
char *path, *ptr, *sp;
path = strdup(m_path.c_str());
ptr = strtok_r(path, "/", &sp);
while (ptr)
{
char *p = ptr;
char *bstart = NULL, *bend = NULL, *bequal = NULL;
while (*p)
{
if (*p == '[')
{
bstart = p + 1;
}
if (*p == ']')
{
bend = p - 1;
}
if (*p == '=' && *(p+1) == '=')
{
bequal = p;
}
p++;
}
if (bstart == NULL && bend == NULL && bequal == NULL)
{
string s(ptr);
m_parsed.push_back(new LiteralPathComponent(s));
}
if (bstart != NULL && bend != NULL)
{
if (bstart > bend)
{
m_logger->error("Invalid JSONPath '%s', malformed selector", path);
goto done;
}
*(bstart - 1) = 0;
string name(ptr);
if (bequal == NULL)
{
char *eptr;
long index = strtol(bstart, &eptr, 10);
if (eptr != bend + 1)
{
m_logger->error("Invalid JSONPath '%s', expected numeric selector");
goto done;
}
m_parsed.push_back(new IndexPathComponent(name, index));
}
else
{
char *property = bstart;
char *value = bequal + 2;
*(bend + 1) = 0;
*bequal = 0;
string p(property), v(value);
m_parsed.push_back(new MatchPathComponent(name, p, v));
}
}
ptr = strtok_r(NULL, "/", &sp);
}
done:
free(path);
}
/**
* A match against a literal path component
*/
JSONPath::LiteralPathComponent::LiteralPathComponent(string& name) : m_name(name)
{
}
/**
* Return the child object of node that matchs the literal name given
*
* @param node The node to match
* @return pointer to the matching node
*/
rapidjson::Value *JSONPath::LiteralPathComponent::match(rapidjson::Value *node)
{
if (node->IsObject() && node->HasMember(m_name.c_str()))
{
return &((*node)[m_name.c_str()]);
}
throw runtime_error("Document has no member " + m_name);
}
/**
* A match against an array index
*/
JSONPath::IndexPathComponent::IndexPathComponent(string& name, int index) : m_name(name), m_index(index)
{
}
/**
* Return the object at the index position of the specified array
*
* @param node The node to match
* @return pointer to the matching node
*/
rapidjson::Value *JSONPath::IndexPathComponent::match(rapidjson::Value *node)
{
if (node->IsObject() && node->HasMember(m_name.c_str()))
{
Value& n = (*node)[m_name.c_str()];
if (n.IsArray())
{
return &n[m_index];
}
}
throw runtime_error("Document has no member " + m_name + " or it is not an array");
}
/**
* Amatch against an object that hase a particular name/value pair
*/
JSONPath::MatchPathComponent::MatchPathComponent(string& name, string& property, string& value) : m_name(name), m_property(property), m_value(value)
{
}
/**
* Match a node within an array or object
*
* @param node The node to match
* @return pointer to the matching node
*/
rapidjson::Value *JSONPath::MatchPathComponent::match(rapidjson::Value *node)
{
if (node->IsObject() && node->HasMember(m_name.c_str()))
{
Value& n = (*node)[m_name.c_str()];
if (n.IsArray())
{
for (auto& v : n.GetArray())
{
if (v.IsObject())
{
if (v.HasMember(m_property.c_str()))
{
if (v[m_property.c_str()].IsString()
&& m_value.compare(v[m_property.c_str()].GetString()) == 0)
return &v;
if (v[m_property.c_str()].IsInt())
{
long val = v[m_property.c_str()].GetInt();
long tval = strtol(m_value.c_str(), NULL, 10);
if (val == tval)
return &v;
}
else if (v[m_property.c_str()].IsDouble())
{
double val = v[m_property.c_str()].GetDouble();
double tval = strtod(m_value.c_str(), NULL);
if (val == tval)
return &v;
}
else if (v[m_property.c_str()].IsBool())
{
bool val = v[m_property.c_str()].GetBool();
if (val && (m_value.compare("true") == 0 || m_value.compare("TRUE") == 0))
return &v;
if (val == false && (m_value.compare("false") == 0 || m_value.compare("FALSE") == 0))
return &v;
}
}
}
}
}
}
throw runtime_error(string("Document has no member ") + m_name + string(" or it does not have a ") + m_property + " property");
}
================================================
FILE: C/common/acl.cpp
================================================
/*
* Fledge category management
*
* Copyright (c) 2022 Dianomic Systems
*
* Released under the Apache 2.0 Licence
*
* Author: Massimiliano Pinto
*/
#include <logger.h>
#include <stdexcept>
#include <acl.h>
#include <rapidjson/document.h>
#include "rapidjson/error/error.h"
#include "rapidjson/error/en.h"
#include <storage_client.h>
using namespace std;
using namespace rapidjson;
/**
* ACLReason constructor:
* parse input JSON for ACL change reason.
*
* JSON should have string attributes 'reason' and 'argument'
*
* @param json The JSON reason string to parse
* @throws exception ACLReasonMalformed
*/
ACL::ACLReason::ACLReason(const string& json)
{
Document doc;
doc.Parse(json.c_str());
if (doc.HasParseError())
{
Logger::getLogger()->error("ACL Reason parse error in %s: %s at %d",
json.c_str(),
GetParseError_En(doc.GetParseError()),
(unsigned)doc.GetErrorOffset());
throw new ACLReasonMalformed();
}
if (!doc.IsObject())
{
Logger::getLogger()->error("ACL Reason is not a JSON object: %sd",
json.c_str());
throw new ACLReasonMalformed();
}
if (doc.HasMember("reason") && doc["reason"].IsString())
{
m_reason = doc["reason"].GetString();
}
if (doc.HasMember("argument") && doc["argument"].IsString())
{
m_argument = doc["argument"].GetString();
}
}
/**
* ACL constructor:
* parse input JSON for ACL content.
*
* JSON should have string attributes 'name' and 'service' and 'url' arrays
*
* @param json The JSON ACL content to parse
* @throws exception ACLMalformed
*/
ACL::ACL(const string& json)
{
Document doc;
doc.Parse(json.c_str());
if (doc.HasParseError())
{
Logger::getLogger()->error("ACL parse error in %s: %s at %d",
json.c_str(),
GetParseError_En(doc.GetParseError()),
(unsigned)doc.GetErrorOffset());
throw new ACLMalformed();
}
Logger::getLogger()->debug("ACL content is %s", json.c_str());
if (!doc.HasMember("name"))
{
Logger::getLogger()->error("Missing 'name' attribute in ACL JSON data");
throw new ACLMalformed();
}
if (doc.HasMember("name") && doc["name"].IsString())
{
m_name = doc["name"].GetString();
}
// Check for service array item
if (doc.HasMember("service") && doc["service"].IsArray())
{
auto &items = doc["service"];
for (auto& item : items.GetArray())
{
if (!item.IsObject())
{
throw new ACLMalformed();
}
for (Value::ConstMemberIterator itr = item.MemberBegin();
itr != item.MemberEnd();
++itr)
{
// Construct KeyValueItem object
KeyValueItem i(itr->name.GetString(),
itr->value.GetString());
// Add object to the vector
m_service.push_back(i);
}
}
}
// Check for url array item
if (doc.HasMember("url") && doc["url"].IsArray())
{
auto &items = doc["url"];
for (auto& item : items.GetArray())
{
if (!item.IsObject())
{
throw new ACLMalformed();
}
string url = item["url"].GetString();
Value &acl = item["acl"];
vector<KeyValueItem> v_acl;
// Check for acl array
if (acl.IsArray())
{
for (auto& item : acl.GetArray())
{
if (!item.IsObject())
{
throw new ACLMalformed();
}
for (Value::ConstMemberIterator itr = item.MemberBegin();
itr != item.MemberEnd();
++itr)
{
// Construct KeyValueItem object
KeyValueItem item(itr->name.GetString(),
itr->value.GetString());
// Add object to the ACL vector
v_acl.push_back(item);
}
}
}
// Construct UrlItem with url and ACL vector
UrlItem u(url, v_acl);
// Add object to the URL vector
m_url.push_back(u);
}
}
}
================================================
FILE: C/common/aggregate.cpp
================================================
/*
* Fledge storage service client
*
* Copyright (c) 2018 OSIsoft, LLC
*
* Released under the Apache 2.0 Licence
*
* Author: Mark Riddoch
*/
#include <aggregate.h>
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
/**
* Return the JSON payload for a where clause
*/
string Aggregate::toJSON()
{
ostringstream json;
json << "{ \"column\" : \"" << m_column << "\",";
json << " \"operation\" : \"" << m_operation << "\" }";
return json.str();
}
================================================
FILE: C/common/asset_tracking.cpp
================================================
/*
* Fledge asset tracking related
*
* Copyright (c) 2019 Dianomic Systems
*
* Released under the Apache 2.0 Licence
*
* Author: Amandeep Singh Arora, Massimiliano Pinto
*/
#include <logger.h>
#include <asset_tracking.h>
#include <config_category.h>
#include "string_utils.h"
using namespace std;
AssetTracker *AssetTracker::instance = 0;
/**
* Worker thread entry point
*/
static void worker(void *arg)
{
AssetTracker *tracker = (AssetTracker *)arg;
tracker->workerThread();
}
/**
* Get asset tracker singleton instance for the current south service
*
* @return Singleton asset tracker instance
*/
AssetTracker *AssetTracker::getAssetTracker()
{
return instance;
}
/**
* AssetTracker class constructor
*
* @param mgtClient Management client object for this south service
* @param service Service name
*/
AssetTracker::AssetTracker(ManagementClient *mgtClient, string service)
: m_mgtClient(mgtClient), m_service(service), m_updateInterval(MIN_ASSET_TRACKER_UPDATE)
{
instance = this;
m_shutdown = false;
m_storageClient = NULL;
m_thread = new thread(worker, this);
try {
// Find out the name of the fledge service
ConfigCategory category = mgtClient->getCategory("service");
if (category.itemExists("name"))
{
m_fledgeName = category.getValue("name");
}
} catch (exception& ex) {
Logger::getLogger()->error("Unable to fetch the service category, %s", ex.what());
}
try {
// Get a handle on the storage layer
ServiceRecord storageRecord("Fledge Storage");
if (!m_mgtClient->getService(storageRecord))
{
Logger::getLogger()->fatal("Unable to find storage service");
return;
}
Logger::getLogger()->info("Connect to storage on %s:%d",
storageRecord.getAddress().c_str(),
storageRecord.getPort());
m_storageClient = new StorageClient(storageRecord.getAddress(),
storageRecord.getPort());
} catch (exception& ex) {
Logger::getLogger()->error("Failed to create storage client", ex.what());
}
}
/**
* Destructor for the asset tracker. We must make sure any pending
* tuples are written out before the asset tracker is destroyed.
*/
AssetTracker::~AssetTracker()
{
m_shutdown = true;
// Signal the worker thread to flush the queue
{
unique_lock<mutex> lck(m_mutex);
m_cv.notify_all();
}
while (m_pending.size())
{
// Wait for pending queue to drain
this_thread::sleep_for(chrono::milliseconds(10));
}
if (m_thread)
{
m_thread->join();
delete m_thread;
m_thread = NULL;
}
if (m_storageClient)
{
delete m_storageClient;
m_storageClient = NULL;
}
for (auto& item : assetTrackerTuplesCache)
{
delete item;
}
assetTrackerTuplesCache.clear();
for (auto& store : storageAssetTrackerTuplesCache)
{
delete store.first;
}
storageAssetTrackerTuplesCache.clear();
}
/**
* Fetch all asset tracking tuples from DB and populate local cache
*
* Return the vector of deprecated asset names
*
* @param plugin Plugin name
* @param event Event name
*/
void AssetTracker::populateAssetTrackingCache(string /*plugin*/, string /*event*/)
{
try {
std::vector<AssetTrackingTuple*>& vec = m_mgtClient->getAssetTrackingTuples(m_service);
for (AssetTrackingTuple* & rec : vec)
{
assetTrackerTuplesCache.emplace(rec);
}
delete (&vec);
}
catch (...)
{
Logger::getLogger()->error("Failed to populate asset tracking tuples' cache");
return;
}
return;
}
/**
* Check local cache for a given asset tracking tuple
*
* @param tuple Tuple to find in cache
* @return Returns whether tuple is present in cache
*/
bool AssetTracker::checkAssetTrackingCache(AssetTrackingTuple& tuple)
{
AssetTrackingTuple *ptr = &tuple;
std::unordered_set<AssetTrackingTuple*>::const_iterator it = assetTrackerTuplesCache.find(ptr);
if (it == assetTrackerTuplesCache.end())
{
return false;
}
else
return true;
}
/**
* Lookup tuple in the asset tracker cache
*
* @param tuple The tuple to lookup
* @return NULL if the tuple is not in the cache or the tuple from the cache
*/
AssetTrackingTuple* AssetTracker::findAssetTrackingCache(AssetTrackingTuple& tuple)
{
AssetTrackingTuple *ptr = &tuple;
std::unordered_set<AssetTrackingTuple*>::const_iterator it = assetTrackerTuplesCache.find(ptr);
if (it == assetTrackerTuplesCache.end())
{
return NULL;
}
else
{
return *it;
}
}
/**
* Add asset tracking tuple via microservice management API and in cache
*
* @param tuple New tuple to add in DB and in cache
*/
void AssetTracker::addAssetTrackingTuple(AssetTrackingTuple& tuple)
{
std::unordered_set<AssetTrackingTuple*>::const_iterator it = assetTrackerTuplesCache.find(&tuple);
if (it == assetTrackerTuplesCache.end())
{
AssetTrackingTuple *ptr = new AssetTrackingTuple(tuple);
assetTrackerTuplesCache.emplace(ptr);
queue(ptr);
Logger::getLogger()->debug("addAssetTrackingTuple(): Added tuple to cache: '%s'", tuple.assetToString().c_str());
}
}
/**
* Add asset tracking tuple via microservice management API and in cache
*
* @param plugin Plugin name
* @param asset Asset name
* @param event Event name
*/
void AssetTracker::addAssetTrackingTuple(string plugin, string asset, string event)
{
// in case of "Filter" event, 'plugin' input argument is category name, so remove service name (prefix) & '_' from it
if (event == string("Filter"))
{
string pattern = m_service + "_";
if (plugin.find(pattern) != string::npos)
plugin.erase(plugin.begin(), plugin.begin() + m_service.length() + 1);
}
asset = escape(asset);
AssetTrackingTuple tuple(m_service, plugin, asset, event);
addAssetTrackingTuple(tuple);
}
/**
* Return the name of the service responsible for particular event of the named asset
*
* @param event The event of interest
* @param asset The asset we are interested in
* @return string The service name of the service that ingests the asset
* @throws exception If the service could not be found
*/
string AssetTracker::getService(const std::string& event, const std::string& asset)
{
// Fetch all asset tracker records
std::vector<AssetTrackingTuple*>& vec = m_mgtClient->getAssetTrackingTuples();
string foundService;
for (AssetTrackingTuple* &rec : vec)
{
// Return first service name with given asset and event
if (rec->m_assetName == asset && rec->m_eventName == event)
{
foundService = rec->m_serviceName;
break;
}
}
delete (&vec);
// Return found service or raise an exception
if (foundService != "")
{
return foundService;
}
else
{
Logger::getLogger()->error("No service found for asset '%s' and event '%s'",
event.c_str(),
asset.c_str());
throw runtime_error("Fetching service for asset not yet implemented");
}
}
/**
* Constructor for an asset tracking tuple table
*/
AssetTrackingTable::AssetTrackingTable()
{
}
/**
* Destructor for asset tracking tuple table
*/
AssetTrackingTable::~AssetTrackingTable()
{
for (auto t : m_tuples)
{
delete t.second;
}
}
/**
* Add a tuple to an asset tracking table
*
* @param tuple Pointer to the asset tracking tuple to add
*/
void AssetTrackingTable::add(AssetTrackingTuple *tuple)
{
auto ret = m_tuples.insert(pair<string, AssetTrackingTuple *>(tuple->getAssetName(), tuple));
if (ret.second == false)
delete tuple; // Already exists
}
/**
* Find the named asset tuple and return a pointer to te asset
*
* @param name The name of the asset to lookup
* @return AssetTrackingTupple* The matchign tuple or NULL
*/
AssetTrackingTuple *AssetTrackingTable::find(const string& name)
{
auto ret = m_tuples.find(name);
if (ret != m_tuples.end())
return ret->second;
return NULL;
}
/**
* Remove an asset tracking tuple from the table
*/
void AssetTrackingTable::remove(const string& name)
{
auto ret = m_tuples.find(name);
if (ret != m_tuples.end())
{
m_tuples.erase(ret);
delete ret->second; // Free the tuple
}
}
/**
* Queue an asset tuple for writing to the database.
*/
void AssetTracker::queue(TrackingTuple *tuple)
{
unique_lock<mutex> lck(m_mutex);
m_pending.emplace(tuple);
m_cv.notify_all();
}
/**
* Set the update interval for the asset tracker.
*
* @param interval The number of milliseconds between update of the asset tracker
* @return bool Was the update accepted
*/
bool AssetTracker::tune(unsigned long interval)
{
unique_lock<mutex> lck(m_mutex);
if (interval >= MIN_ASSET_TRACKER_UPDATE)
{
m_updateInterval = interval;
}
else
{
Logger::getLogger()->error("Attempt to set asset tracker update to less than minimum interval");
return false;
}
return true;
}
/**
* The worker thread that will flush any pending asset tuples to
* the database.
*/
void AssetTracker::workerThread()
{
unique_lock<mutex> lck(m_mutex);
while (m_pending.empty() && m_shutdown == false)
{
m_cv.wait_for(lck, chrono::milliseconds(m_updateInterval));
processQueue();
}
// Process any items left in the queue at shutdown
processQueue();
}
/**
* Process the queue of asset tracking tuple
*/
void AssetTracker::processQueue()
{
vector<InsertValues> values;
static bool warned = false;
while (!m_pending.empty())
{
// Get first element as TrackingTuple calss
TrackingTuple *tuple = m_pending.front();
// Write the tuple - ideally we would like a bulk update here or to go direct to the
// database. However we need the Fledge service name for that, which is now in
// the member variable m_fledgeName
bool warn = warned;
// Call class specialised processData routine:
// - 1 Insert asset tracker data via Fledge API as fallback
// or
// - get values for direct DB operation
InsertValues iValue = tuple->processData(m_storageClient != NULL,
m_mgtClient,
warn,
m_fledgeName);
warned = warn;
// Bulk DB insert when queue is empty
if (iValue.size() > 0)
{
values.push_back(iValue);
}
// Remove element
m_pending.pop();
}
// Queue processed, bulk direct DB data insert could be done
if (m_storageClient && values.size() > 0)
{
// Bulk DB insert
int n_rows = m_storageClient->insertTable("asset_tracker", values);
if (n_rows != values.size())
{
Logger::getLogger()->warn("The asset tracker failed to insert all records %d of %d inserted",
n_rows, values.size());
}
}
}
/**
* Fetch all storage asset tracking tuples from DB and populate local cache
*
* Return the vector of deprecated asset names
*
*/
void AssetTracker::populateStorageAssetTrackingCache()
{
try {
std::vector<StorageAssetTrackingTuple*>& vec =
(std::vector<StorageAssetTrackingTuple*>&) m_mgtClient->getStorageAssetTrackingTuples(m_service);
for (StorageAssetTrackingTuple* & rec : vec)
{
set<string> setOfDPs = getDataPointsSet(rec->m_datapoints);
if (setOfDPs.size() == 0)
{
Logger::getLogger()->warn("%s:%d Datapoints unavailable for service %s ",
__FUNCTION__,
__LINE__,
m_service.c_str());
}
// Add item into cache
storageAssetTrackerTuplesCache.emplace(rec, setOfDPs);
}
delete (&vec);
}
catch (...)
{
Logger::getLogger()->error("%s:%d Failed to populate storage asset " \
"tracking tuples' cache",
__FUNCTION__,
__LINE__);
return;
}
return;
}
//This function takes a string of datapoints in comma-separated format and returns
//set of string datapoint values
std::set<std::string> AssetTracker::getDataPointsSet(std::string strDatapoints)
{
std::set<std::string> tokens;
stringstream st(strDatapoints);
std::string temp;
while(getline(st, temp, ','))
{
tokens.insert(temp);
}
return tokens;
}
/**
* Return Plugin Information in the Fledge configuration
*
* @return bool True if the plugin info could be obtained
*/
bool AssetTracker::getFledgeConfigInfo()
{
Logger::getLogger()->error("StorageAssetTracker::getPluginInfo start");
try {
string url = "/fledge/category/service";
if (!m_mgtClient)
{
Logger::getLogger()->error("%s:%d, m_mgtClient Ptr is NULL",
__FUNCTION__,
__LINE__);
return false;
}
auto res = m_mgtClient->getHttpClient()->request("GET", url.c_str());
Document doc;
string response = res->content.string();
doc.Parse(response.c_str());
if (doc.HasParseError())
{
bool httpError = (isdigit(response[0]) &&
isdigit(response[1]) &&
isdigit(response[2]) &&
response[3]==':');
Logger::getLogger()->error("%s fetching service record: %s\n",
httpError?"HTTP error while":"Failed to parse result of",
response.c_str());
return false;
}
else if (doc.HasMember("message"))
{
Logger::getLogger()->error("Failed to fetch /fledge/category/service %s.",
doc["message"].GetString());
return false;
}
else
{
Value& serviceName = doc["name"];
if (!serviceName.IsObject())
{
Logger::getLogger()->error("%s:%d, serviceName is not an object",
__FUNCTION__,
__LINE__);
return false;
}
if (!serviceName.HasMember("value"))
{
Logger::getLogger()->error("%s:%d, serviceName has no member value",
__FUNCTION__,
__LINE__);
return false;
}
Value& serviceVal = serviceName["value"];
if ( !serviceVal.IsString())
{
Logger::getLogger()->error("%s:%d, serviceVal is not a string",
__FUNCTION__,
__LINE__);
return false;
}
m_fledgeName = serviceVal.GetString();
Logger::getLogger()->error("%s:%d, m_plugin value = %s",
__FUNCTION__,
__LINE__,
m_fledgeName.c_str());
return true;
}
} catch (const SimpleWeb::system_error &e) {
Logger::getLogger()->error("Get service failed %s.", e.what());
return false;
}
return false;
}
/** This function takes a StorageAsset
gitextract_gasud238/
├── .cursor/
│ ├── rules/
│ │ ├── C/
│ │ │ ├── core.mdc
│ │ │ └── plugins/
│ │ │ ├── filter.mdc
│ │ │ ├── north.mdc
│ │ │ └── south.mdc
│ │ ├── README.md
│ │ ├── docs.mdc
│ │ ├── python/
│ │ │ ├── api.mdc
│ │ │ ├── config.mdc
│ │ │ ├── core.mdc
│ │ │ └── quality.mdc
│ │ └── tests/
│ │ └── python/
│ │ ├── api.mdc
│ │ └── unit.mdc
│ └── services/
│ ├── notification.mdc
│ └── notification_code_review.mdc
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ ├── doc_issue.yml
│ │ └── feature_request.yml
│ └── workflows/
│ └── checker.yml
├── .gitignore
├── .readthedocs.yaml
├── ADOPTERS.MD
├── C/
│ ├── common/
│ │ ├── CMakeLists.txt
│ │ ├── JSONPath.cpp
│ │ ├── acl.cpp
│ │ ├── aggregate.cpp
│ │ ├── asset_tracking.cpp
│ │ ├── audit_logger.cpp
│ │ ├── base64databuffer.cpp
│ │ ├── base64image.cpp
│ │ ├── bearer_token.cpp
│ │ ├── config_category.cpp
│ │ ├── cryptography_utils.cpp
│ │ ├── databuffer.cpp
│ │ ├── datapoint.cpp
│ │ ├── datapoint_utility.cpp
│ │ ├── file_utils.cpp
│ │ ├── filter_pipeline.cpp
│ │ ├── filter_plugin.cpp
│ │ ├── form_data.cpp
│ │ ├── image.cpp
│ │ ├── include/
│ │ │ ├── JSONPath.h
│ │ │ ├── acl.h
│ │ │ ├── aggregate.h
│ │ │ ├── asset_tracking.h
│ │ │ ├── audit_logger.h
│ │ │ ├── base64.h
│ │ │ ├── base64databuffer.h
│ │ │ ├── base64dpimage.h
│ │ │ ├── bearer_token.h
│ │ │ ├── config_category.h
│ │ │ ├── cryptography_utils.h
│ │ │ ├── databuffer.h
│ │ │ ├── datapoint.h
│ │ │ ├── datapoint_utility.h
│ │ │ ├── dpimage.h
│ │ │ ├── expression.h
│ │ │ ├── exprtk.hpp
│ │ │ ├── file_utils.h
│ │ │ ├── filter_pipeline.h
│ │ │ ├── filter_plugin.h
│ │ │ ├── form_data.h
│ │ │ ├── insert.h
│ │ │ ├── join.h
│ │ │ ├── json_properties.h
│ │ │ ├── json_provider.h
│ │ │ ├── json_utils.h
│ │ │ ├── logger.h
│ │ │ ├── management_client.h
│ │ │ ├── pipeline_debugger.h
│ │ │ ├── pipeline_element.h
│ │ │ ├── plugin_data.h
│ │ │ ├── process.h
│ │ │ ├── purge_result.h
│ │ │ ├── pyruntime.h
│ │ │ ├── pythonconfigcategory.h
│ │ │ ├── pythonreading.h
│ │ │ ├── pythonreadingset.h
│ │ │ ├── query.h
│ │ │ ├── reading.h
│ │ │ ├── reading_circularbuffer.h
│ │ │ ├── reading_set.h
│ │ │ ├── reading_stream.h
│ │ │ ├── readingset_circularbuffer.h
│ │ │ ├── resultset.h
│ │ │ ├── returns.h
│ │ │ ├── service_record.h
│ │ │ ├── sort.h
│ │ │ ├── storage_client.h
│ │ │ ├── string_utils.h
│ │ │ ├── timebucket.h
│ │ │ ├── update_modifier.h
│ │ │ ├── utils.h
│ │ │ ├── value.h
│ │ │ └── where.h
│ │ ├── join.cpp
│ │ ├── json_utils.cpp
│ │ ├── logger.cpp
│ │ ├── management_client.cpp
│ │ ├── pipeline_branch.cpp
│ │ ├── pipeline_debugger.cpp
│ │ ├── pipeline_element.cpp
│ │ ├── pipeline_filter.cpp
│ │ ├── pipeline_writer.cpp
│ │ ├── plugin_data.cpp
│ │ ├── process.cpp
│ │ ├── purge_result.cpp
│ │ ├── pyexception.cpp
│ │ ├── pyruntime.cpp
│ │ ├── pythonconfigcategory.cpp
│ │ ├── pythonreading.cpp
│ │ ├── pythonreadingset.cpp
│ │ ├── query.cpp
│ │ ├── reading.cpp
│ │ ├── reading_circularbuffer.cpp
│ │ ├── reading_set.cpp
│ │ ├── readingset_circularbuffer.cpp
│ │ ├── result_set.cpp
│ │ ├── service_record.cpp
│ │ ├── storage_client.cpp
│ │ ├── string_utils.cpp
│ │ └── where.cpp
│ ├── plugins/
│ │ ├── common/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── http_sender.cpp
│ │ │ ├── include/
│ │ │ │ ├── http_sender.h
│ │ │ │ ├── libcurl_https.h
│ │ │ │ ├── piwebapi.h
│ │ │ │ ├── simple_http.h
│ │ │ │ └── simple_https.h
│ │ │ ├── libcurl_https.cpp
│ │ │ ├── piwebapi.cpp
│ │ │ ├── simple_http.cpp
│ │ │ └── simple_https.cpp
│ │ ├── filter/
│ │ │ └── common/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── filter.cpp
│ │ │ └── include/
│ │ │ └── filter.h
│ │ ├── north/
│ │ │ └── OMF/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── OMFError.cpp
│ │ │ ├── include/
│ │ │ │ ├── OMFHint.h
│ │ │ │ ├── basetypes.h
│ │ │ │ ├── linkedlookup.h
│ │ │ │ ├── ocs.h
│ │ │ │ ├── omf.h
│ │ │ │ ├── omfbuffer.h
│ │ │ │ ├── omferror.h
│ │ │ │ ├── omfinfo.h
│ │ │ │ └── omflinkeddata.h
│ │ │ ├── linkdata.cpp
│ │ │ ├── ocs.cpp
│ │ │ ├── omf.cpp
│ │ │ ├── omfbuffer.cpp
│ │ │ ├── omfhints.cpp
│ │ │ ├── omfinfo.cpp
│ │ │ └── plugin.cpp
│ │ ├── storage/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── README.rst
│ │ │ ├── common/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── disk_monitor.cpp
│ │ │ │ ├── include/
│ │ │ │ │ ├── disk_monitor.h
│ │ │ │ │ └── sql_buffer.h
│ │ │ │ └── sql_buffer.cpp
│ │ │ ├── postgres/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── CheckRhPg.cmake
│ │ │ │ ├── README.rst
│ │ │ │ ├── connection.cpp
│ │ │ │ ├── connection_manager.cpp
│ │ │ │ ├── include/
│ │ │ │ │ ├── connection.h
│ │ │ │ │ └── connection_manager.h
│ │ │ │ └── plugin.cpp
│ │ │ ├── sqlite/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── Findsqlite3.cmake
│ │ │ │ ├── common/
│ │ │ │ │ ├── connection.cpp
│ │ │ │ │ ├── connection_manager.cpp
│ │ │ │ │ ├── include/
│ │ │ │ │ │ ├── connection.h
│ │ │ │ │ │ ├── connection_manager.h
│ │ │ │ │ │ ├── purge_configuration.h
│ │ │ │ │ │ ├── readings_catalogue.h
│ │ │ │ │ │ └── sqlite_common.h
│ │ │ │ │ ├── purge_configuration.cpp
│ │ │ │ │ ├── readings.cpp
│ │ │ │ │ └── readings_catalogue.cpp
│ │ │ │ ├── include/
│ │ │ │ │ ├── common.h
│ │ │ │ │ └── profile.h
│ │ │ │ ├── plugin.cpp
│ │ │ │ └── schema/
│ │ │ │ ├── include/
│ │ │ │ │ └── schema.h
│ │ │ │ └── schema.cpp
│ │ │ ├── sqlitelb/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── Findsqlite3.cmake
│ │ │ │ ├── common/
│ │ │ │ │ ├── connection.cpp
│ │ │ │ │ ├── connection_manager.cpp
│ │ │ │ │ ├── include/
│ │ │ │ │ │ ├── connection.h
│ │ │ │ │ │ └── connection_manager.h
│ │ │ │ │ └── readings.cpp
│ │ │ │ ├── include/
│ │ │ │ │ ├── common.h
│ │ │ │ │ └── profile.h
│ │ │ │ └── plugin.cpp
│ │ │ └── sqlitememory/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── Findsqlite3.cmake
│ │ │ ├── connection.cpp
│ │ │ ├── include/
│ │ │ │ ├── connection.h
│ │ │ │ └── connection_manager.h
│ │ │ └── plugin.cpp
│ │ └── utils/
│ │ ├── CMakeLists.txt
│ │ ├── cmdutil.cpp
│ │ └── get_plugin_info.cpp
│ ├── services/
│ │ ├── common/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── README.rst
│ │ │ ├── config_handler.cpp
│ │ │ ├── filter_python_plugin_handle.cpp
│ │ │ ├── include/
│ │ │ │ ├── binary_plugin_handle.h
│ │ │ │ ├── config_handler.h
│ │ │ │ ├── filter_python_plugin_handle.h
│ │ │ │ ├── management_api.h
│ │ │ │ ├── north_python_plugin_handle.h
│ │ │ │ ├── notification_python_plugin_handle.h
│ │ │ │ ├── perfmonitors.h
│ │ │ │ ├── plugin.h
│ │ │ │ ├── plugin_api.h
│ │ │ │ ├── plugin_exception.h
│ │ │ │ ├── plugin_handle.h
│ │ │ │ ├── plugin_manager.h
│ │ │ │ ├── python_plugin_handle.h
│ │ │ │ ├── service_handler.h
│ │ │ │ └── south_python_plugin_handle.h
│ │ │ ├── management_api.cpp
│ │ │ ├── north_python_plugin_handle.cpp
│ │ │ ├── notification_python_plugin_handle.cpp
│ │ │ ├── perfmonitor.cpp
│ │ │ ├── plugin.cpp
│ │ │ ├── plugin_manager.cpp
│ │ │ ├── service_security.cpp
│ │ │ └── south_python_plugin_handle.cpp
│ │ ├── common-plugin-interfaces/
│ │ │ └── python/
│ │ │ └── include/
│ │ │ └── python_plugin_common_interface.h
│ │ ├── core/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── configuration_manager.cpp
│ │ │ ├── core_management_api.cpp
│ │ │ ├── include/
│ │ │ │ ├── configuration_manager.h
│ │ │ │ ├── core_management_api.h
│ │ │ │ └── service_registry.h
│ │ │ └── service_registry.cpp
│ │ ├── filter-plugin-interfaces/
│ │ │ └── python/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── filter_ingest_pymodule/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ └── ingest_callback_pymodule.cpp
│ │ │ └── python_plugin_interface.cpp
│ │ ├── north/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── README.rst
│ │ │ ├── data_load.cpp
│ │ │ ├── data_send.cpp
│ │ │ ├── include/
│ │ │ │ ├── data_load.h
│ │ │ │ ├── data_sender.h
│ │ │ │ ├── defaults.h
│ │ │ │ ├── north_api.h
│ │ │ │ ├── north_plugin.h
│ │ │ │ └── north_service.h
│ │ │ ├── north.cpp
│ │ │ ├── north_api.cpp
│ │ │ └── north_plugin.cpp
│ │ ├── north-plugin-interfaces/
│ │ │ └── python/
│ │ │ ├── CMakeLists.txt
│ │ │ └── python_plugin_interface.cpp
│ │ ├── notification-plugin-interfaces/
│ │ │ └── python/
│ │ │ ├── CMakeLists.txt
│ │ │ └── python_plugin_interface.cpp
│ │ ├── south/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── README.rst
│ │ │ ├── include/
│ │ │ │ ├── defaults.h
│ │ │ │ ├── ingest.h
│ │ │ │ ├── ingest_rate.h
│ │ │ │ ├── south_api.h
│ │ │ │ ├── south_plugin.h
│ │ │ │ └── south_service.h
│ │ │ ├── ingest.cpp
│ │ │ ├── ingestRate.cpp
│ │ │ ├── south.cpp
│ │ │ ├── south_api.cpp
│ │ │ └── south_plugin.cpp
│ │ ├── south-plugin-interfaces/
│ │ │ └── python/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── async_ingest_pymodule/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ └── ingest_callback_pymodule.cpp
│ │ │ └── python_plugin_interface.cpp
│ │ └── storage/
│ │ ├── CMakeLists.txt
│ │ ├── README.rst
│ │ ├── configuration.cpp
│ │ ├── include/
│ │ │ ├── configuration.h
│ │ │ ├── plugin_configuration.h
│ │ │ ├── storage_api.h
│ │ │ ├── storage_plugin.h
│ │ │ ├── storage_registry.h
│ │ │ ├── storage_service.h
│ │ │ ├── storage_stats.h
│ │ │ └── stream_handler.h
│ │ ├── pluginconfiguration.cpp
│ │ ├── storage
│ │ ├── storage.cpp
│ │ ├── storage_api.cpp
│ │ ├── storage_plugin.cpp
│ │ ├── storage_registry.cpp
│ │ ├── storage_stats.cpp
│ │ └── stream_handler.cpp
│ ├── tasks/
│ │ ├── check_updates/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── check_updates.cpp
│ │ │ ├── include/
│ │ │ │ └── check_updates.h
│ │ │ └── main.cpp
│ │ ├── north/
│ │ │ ├── CMakeLists.txt
│ │ │ └── sending_process/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── include/
│ │ │ │ ├── north_filter_pipeline.h
│ │ │ │ ├── north_plugin.h
│ │ │ │ └── sending.h
│ │ │ ├── north_filter_pipeline.cpp
│ │ │ ├── north_plugin.cpp
│ │ │ ├── sending.cpp
│ │ │ └── sending_process.cpp
│ │ ├── purge_system/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── include/
│ │ │ │ └── purge_system.h
│ │ │ ├── main.cpp
│ │ │ └── purge_system.cpp
│ │ └── statistics_history/
│ │ ├── CMakeLists.txt
│ │ ├── include/
│ │ │ └── stats_history.h
│ │ ├── main.cpp
│ │ └── stats_history.cpp
│ └── thirdparty/
│ ├── Simple-Web-Server/
│ │ ├── CMakeLists.txt
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── asio_compatibility.hpp
│ │ ├── client_http.hpp
│ │ ├── client_https.hpp
│ │ ├── crypto.hpp
│ │ ├── docs/
│ │ │ ├── Doxyfile
│ │ │ └── benchmarks.md
│ │ ├── http_examples.cpp
│ │ ├── https_examples.cpp
│ │ ├── mutex.hpp
│ │ ├── server_http.hpp
│ │ ├── server_https.hpp
│ │ ├── status_code.hpp
│ │ ├── tests/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── assert.hpp
│ │ │ ├── crypto_test.cpp
│ │ │ ├── io_test.cpp
│ │ │ ├── parse_test.cpp
│ │ │ └── status_code_test.cpp
│ │ ├── utility.hpp
│ │ └── web/
│ │ ├── index.html
│ │ └── test.html
│ └── rapidjson/
│ ├── .gitattributes
│ ├── .gitignore
│ ├── .gitmodules
│ ├── .travis.yml
│ ├── CHANGELOG.md
│ ├── CMakeLists.txt
│ ├── CMakeModules/
│ │ └── FindGTestSrc.cmake
│ ├── RapidJSON.pc.in
│ ├── RapidJSONConfig.cmake.in
│ ├── RapidJSONConfigVersion.cmake.in
│ ├── appveyor.yml
│ ├── bin/
│ │ ├── data/
│ │ │ ├── glossary.json
│ │ │ ├── menu.json
│ │ │ ├── readme.txt
│ │ │ ├── sample.json
│ │ │ ├── webapp.json
│ │ │ └── widget.json
│ │ ├── encodings/
│ │ │ ├── utf16be.json
│ │ │ ├── utf16bebom.json
│ │ │ ├── utf16le.json
│ │ │ ├── utf16lebom.json
│ │ │ ├── utf32be.json
│ │ │ ├── utf32bebom.json
│ │ │ ├── utf32le.json
│ │ │ ├── utf32lebom.json
│ │ │ ├── utf8.json
│ │ │ └── utf8bom.json
│ │ ├── jsonchecker/
│ │ │ ├── fail1.json
│ │ │ ├── fail10.json
│ │ │ ├── fail11.json
│ │ │ ├── fail12.json
│ │ │ ├── fail13.json
│ │ │ ├── fail14.json
│ │ │ ├── fail15.json
│ │ │ ├── fail16.json
│ │ │ ├── fail17.json
│ │ │ ├── fail18.json
│ │ │ ├── fail19.json
│ │ │ ├── fail2.json
│ │ │ ├── fail20.json
│ │ │ ├── fail21.json
│ │ │ ├── fail22.json
│ │ │ ├── fail23.json
│ │ │ ├── fail24.json
│ │ │ ├── fail25.json
│ │ │ ├── fail26.json
│ │ │ ├── fail27.json
│ │ │ ├── fail28.json
│ │ │ ├── fail29.json
│ │ │ ├── fail3.json
│ │ │ ├── fail30.json
│ │ │ ├── fail31.json
│ │ │ ├── fail32.json
│ │ │ ├── fail33.json
│ │ │ ├── fail4.json
│ │ │ ├── fail5.json
│ │ │ ├── fail6.json
│ │ │ ├── fail7.json
│ │ │ ├── fail8.json
│ │ │ ├── fail9.json
│ │ │ ├── pass1.json
│ │ │ ├── pass2.json
│ │ │ ├── pass3.json
│ │ │ └── readme.txt
│ │ └── types/
│ │ ├── booleans.json
│ │ ├── floats.json
│ │ ├── guids.json
│ │ ├── integers.json
│ │ ├── mixed.json
│ │ ├── nulls.json
│ │ ├── paragraphs.json
│ │ └── readme.txt
│ ├── contrib/
│ │ └── natvis/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── rapidjson.natvis
│ ├── doc/
│ │ ├── CMakeLists.txt
│ │ ├── Doxyfile.in
│ │ ├── Doxyfile.zh-cn.in
│ │ ├── diagram/
│ │ │ ├── architecture.dot
│ │ │ ├── insituparsing.dot
│ │ │ ├── iterative-parser-states-diagram.dot
│ │ │ ├── move1.dot
│ │ │ ├── move2.dot
│ │ │ ├── move3.dot
│ │ │ ├── normalparsing.dot
│ │ │ ├── simpledom.dot
│ │ │ ├── tutorial.dot
│ │ │ └── utilityclass.dot
│ │ ├── dom.md
│ │ ├── dom.zh-cn.md
│ │ ├── encoding.md
│ │ ├── encoding.zh-cn.md
│ │ ├── faq.md
│ │ ├── faq.zh-cn.md
│ │ ├── features.md
│ │ ├── features.zh-cn.md
│ │ ├── internals.md
│ │ ├── internals.zh-cn.md
│ │ ├── misc/
│ │ │ ├── DoxygenLayout.xml
│ │ │ ├── doxygenextra.css
│ │ │ ├── footer.html
│ │ │ └── header.html
│ │ ├── npm.md
│ │ ├── performance.md
│ │ ├── performance.zh-cn.md
│ │ ├── pointer.md
│ │ ├── pointer.zh-cn.md
│ │ ├── sax.md
│ │ ├── sax.zh-cn.md
│ │ ├── schema.md
│ │ ├── schema.zh-cn.md
│ │ ├── stream.md
│ │ ├── stream.zh-cn.md
│ │ ├── tutorial.md
│ │ └── tutorial.zh-cn.md
│ ├── example/
│ │ ├── CMakeLists.txt
│ │ ├── capitalize/
│ │ │ └── capitalize.cpp
│ │ ├── condense/
│ │ │ └── condense.cpp
│ │ ├── filterkey/
│ │ │ └── filterkey.cpp
│ │ ├── filterkeydom/
│ │ │ └── filterkeydom.cpp
│ │ ├── jsonx/
│ │ │ └── jsonx.cpp
│ │ ├── lookaheadparser/
│ │ │ └── lookaheadparser.cpp
│ │ ├── messagereader/
│ │ │ └── messagereader.cpp
│ │ ├── parsebyparts/
│ │ │ └── parsebyparts.cpp
│ │ ├── pretty/
│ │ │ └── pretty.cpp
│ │ ├── prettyauto/
│ │ │ └── prettyauto.cpp
│ │ ├── schemavalidator/
│ │ │ └── schemavalidator.cpp
│ │ ├── serialize/
│ │ │ └── serialize.cpp
│ │ ├── simpledom/
│ │ │ └── simpledom.cpp
│ │ ├── simplepullreader/
│ │ │ └── simplepullreader.cpp
│ │ ├── simplereader/
│ │ │ └── simplereader.cpp
│ │ ├── simplewriter/
│ │ │ └── simplewriter.cpp
│ │ └── tutorial/
│ │ └── tutorial.cpp
│ ├── include/
│ │ └── rapidjson/
│ │ ├── allocators.h
│ │ ├── cursorstreamwrapper.h
│ │ ├── document.h
│ │ ├── encodedstream.h
│ │ ├── encodings.h
│ │ ├── error/
│ │ │ ├── en.h
│ │ │ └── error.h
│ │ ├── filereadstream.h
│ │ ├── filewritestream.h
│ │ ├── fwd.h
│ │ ├── internal/
│ │ │ ├── biginteger.h
│ │ │ ├── clzll.h
│ │ │ ├── diyfp.h
│ │ │ ├── dtoa.h
│ │ │ ├── ieee754.h
│ │ │ ├── itoa.h
│ │ │ ├── meta.h
│ │ │ ├── pow10.h
│ │ │ ├── regex.h
│ │ │ ├── stack.h
│ │ │ ├── strfunc.h
│ │ │ ├── strtod.h
│ │ │ └── swap.h
│ │ ├── istreamwrapper.h
│ │ ├── memorybuffer.h
│ │ ├── memorystream.h
│ │ ├── msinttypes/
│ │ │ ├── inttypes.h
│ │ │ └── stdint.h
│ │ ├── ostreamwrapper.h
│ │ ├── pointer.h
│ │ ├── prettywriter.h
│ │ ├── rapidjson.h
│ │ ├── reader.h
│ │ ├── schema.h
│ │ ├── stream.h
│ │ ├── stringbuffer.h
│ │ ├── uri.h
│ │ └── writer.h
│ ├── include_dirs.js
│ ├── library.json
│ ├── license.txt
│ ├── package.json
│ ├── rapidjson.autopkg
│ ├── readme.md
│ ├── readme.zh-cn.md
│ ├── test/
│ │ ├── CMakeLists.txt
│ │ ├── perftest/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── misctest.cpp
│ │ │ ├── perftest.cpp
│ │ │ ├── perftest.h
│ │ │ ├── platformtest.cpp
│ │ │ ├── rapidjsontest.cpp
│ │ │ └── schematest.cpp
│ │ ├── unittest/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── allocatorstest.cpp
│ │ │ ├── bigintegertest.cpp
│ │ │ ├── documenttest.cpp
│ │ │ ├── dtoatest.cpp
│ │ │ ├── encodedstreamtest.cpp
│ │ │ ├── encodingstest.cpp
│ │ │ ├── filestreamtest.cpp
│ │ │ ├── fwdtest.cpp
│ │ │ ├── istreamwrappertest.cpp
│ │ │ ├── itoatest.cpp
│ │ │ ├── jsoncheckertest.cpp
│ │ │ ├── namespacetest.cpp
│ │ │ ├── ostreamwrappertest.cpp
│ │ │ ├── pointertest.cpp
│ │ │ ├── prettywritertest.cpp
│ │ │ ├── readertest.cpp
│ │ │ ├── regextest.cpp
│ │ │ ├── schematest.cpp
│ │ │ ├── simdtest.cpp
│ │ │ ├── strfunctest.cpp
│ │ │ ├── stringbuffertest.cpp
│ │ │ ├── strtodtest.cpp
│ │ │ ├── unittest.cpp
│ │ │ ├── unittest.h
│ │ │ ├── valuetest.cpp
│ │ │ └── writertest.cpp
│ │ └── valgrind.supp
│ └── travis-doxygen.sh
├── CMakeLists.txt
├── CONTRIBUTING.md
├── GOVERNANCE.MD
├── LICENSE
├── Makefile
├── README.rst
├── SECURITY.MD
├── VERSION
├── contrib/
│ └── .gitkeep
├── data/
│ ├── etc/
│ │ └── kerberos/
│ │ └── README.rst
│ └── extras/
│ └── fogbench/
│ └── fogbench_sensor_coap.template.json
├── dco-signoffs/
│ ├── AmandeepSinghArora-dco-signoff.txt
│ ├── AshishJabble-dco-signoff.txt
│ ├── AshwinGopalakrishnan-dco-signoff.txt
│ ├── BillHunt-dco-signoff.txt
│ ├── MarkRiddoch-dco-signoff.txt
│ ├── MassimilianoPinto-dco-signoff.txt
│ ├── MohdShariq-dco-signoff.txt
│ ├── MonikaSharma-dco-signoff.txt
│ ├── OriShadmon-dco-signoff.txt
│ ├── PraveenGarg-dco-signoff.txt
│ ├── StefanoSimonelli-dco-signoff.txt
│ ├── YashTatkondawar-dco-signoff.txt
│ └── other-dco-signoff.txt
├── docs/
│ ├── 91_version_history.rst
│ ├── 92_downloads.rst
│ ├── KERBEROS.rst
│ ├── Makefile
│ ├── OMF.rst
│ ├── RASPBIAN.rst
│ ├── _static/
│ │ ├── .gitkeep
│ │ ├── theme_overrides.css
│ │ └── version_menu.css
│ ├── _templates/
│ │ └── breadcrumbs.html
│ ├── acl.rst
│ ├── build_index.rst
│ ├── building_fledge/
│ │ ├── 01_introduction.rst
│ │ ├── 04_installation.rst
│ │ ├── 04_utilities.rst
│ │ ├── 05_tasks.rst
│ │ ├── 06_testing.rst
│ │ ├── building_fledge.rst
│ │ └── index.rst
│ ├── building_pipelines.rst
│ ├── check-sphinx.py
│ ├── conf.py
│ ├── control.rst
│ ├── control_scripts.rst
│ ├── fledge-north-OMF.rst
│ ├── fledge-rule-DataAvailability/
│ │ └── index.rst
│ ├── fledge-rule-Threshold/
│ │ └── index.rst
│ ├── fledge_architecture.rst
│ ├── glossary.rst
│ ├── index.rst
│ ├── introduction.rst
│ ├── keywords/
│ │ ├── Augmentation
│ │ ├── Cleansing
│ │ ├── Cloud
│ │ ├── Compression
│ │ ├── Governance
│ │ ├── Image
│ │ ├── Labelling
│ │ ├── MQTT
│ │ ├── Mathematical
│ │ ├── ModelExecution
│ │ ├── Namespace
│ │ ├── PLC
│ │ ├── README.rst
│ │ ├── Scripted
│ │ ├── Signal Processing
│ │ ├── Simulation
│ │ ├── Structure
│ │ ├── Textual
│ │ └── Vibration
│ ├── make.bat
│ ├── monitoring/
│ │ ├── configuration.rst
│ │ ├── flow.rst
│ │ ├── index.rst
│ │ ├── introduction.rst
│ │ ├── quality.rst
│ │ ├── resources.rst
│ │ └── service.rst
│ ├── plugin_developers_guide/
│ │ ├── 00_source_code_doc.rst
│ │ ├── 01_01_Data.rst
│ │ ├── 01_Fledge_plugins.rst
│ │ ├── 02_persisting_data.rst
│ │ ├── 02_writing_plugins.rst
│ │ ├── 035_CPP.rst
│ │ ├── 037_hybrid_plugins.rst
│ │ ├── 03_01_DHT11.rst
│ │ ├── 03_02_Control.rst
│ │ ├── 03_02_DHT11_C.rst
│ │ ├── 03_02_south_python_Control.rst
│ │ ├── 03_south_C_plugins.rst
│ │ ├── 03_south_plugins.rst
│ │ ├── 04_north_plugins.rst
│ │ ├── 05_storage_plugins.rst
│ │ ├── 06_filter_plugins.rst
│ │ ├── 07_rules_plugins.rst
│ │ ├── 08_notify_plugins.rst
│ │ ├── 08_storage.rst
│ │ ├── 09_packaging.rst
│ │ ├── 10_testing.rst
│ │ ├── 11_WSL2.rst
│ │ └── index.rst
│ ├── plugin_index.rst
│ ├── processing_data.rst
│ ├── quick_start/
│ │ ├── backup.rst
│ │ ├── datasources.rst
│ │ ├── gui.rst
│ │ ├── index.rst
│ │ ├── installing.rst
│ │ ├── instructions.txt
│ │ ├── north.rst
│ │ ├── platforms.rst
│ │ ├── starting.rst
│ │ ├── support.rst
│ │ ├── troubleshooting.rst
│ │ ├── uninstalling.rst
│ │ ├── update.rst
│ │ └── viewing.rst
│ ├── requirements.txt
│ ├── rest_api_guide/
│ │ ├── 01_REST.rst
│ │ ├── 02_RESTauthentication.rst
│ │ ├── 03_RESTadmin.rst
│ │ ├── 03_RESTassetTracker.rst
│ │ ├── 03_RESTservices.rst
│ │ ├── 03_RESTstatistics.rst
│ │ ├── 03_RESTupdate.rst
│ │ ├── 04_RESTuser.rst
│ │ ├── 05_RESTdeveloper.rst
│ │ ├── 06_GrafanaExamples.rst
│ │ └── index.rst
│ ├── scripts/
│ │ ├── fledge_plugin_list
│ │ └── plugin_and_service_documentation
│ ├── securing_fledge.rst
│ ├── storage.rst
│ ├── troubleshooting_pi-server_integration.rst
│ └── tuning_fledge.rst
├── doxy.config
├── extras/
│ ├── python/
│ │ ├── .gitignore
│ │ └── fogbench/
│ │ ├── __init__.py
│ │ ├── __main__.py
│ │ └── exceptions.py
│ └── scripts/
│ ├── fledge.service
│ └── setenv.sh
├── mkversion
├── python/
│ ├── .gitignore
│ ├── .pylintrc
│ ├── __init__.py
│ ├── __template__.py
│ ├── fledge/
│ │ ├── __init__.py
│ │ ├── apps/
│ │ │ ├── __init__.py
│ │ │ └── common/
│ │ │ ├── README.rst
│ │ │ └── __init__.py
│ │ ├── common/
│ │ │ ├── README.rst
│ │ │ ├── __init__.py
│ │ │ ├── acl_manager.py
│ │ │ ├── alert_manager.py
│ │ │ ├── audit_logger.py
│ │ │ ├── common.py
│ │ │ ├── configuration_manager.py
│ │ │ ├── iprpc.py
│ │ │ ├── logger.py
│ │ │ ├── microservice_management_client/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── exceptions.py
│ │ │ │ └── microservice_management_client.py
│ │ │ ├── parser.py
│ │ │ ├── plugin_discovery.py
│ │ │ ├── plugin_helpers.py
│ │ │ ├── process.py
│ │ │ ├── service_record.py
│ │ │ ├── statistics.py
│ │ │ ├── storage_client/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── payload_builder.py
│ │ │ │ ├── storage_client.py
│ │ │ │ └── utils.py
│ │ │ ├── utils.py
│ │ │ └── web/
│ │ │ ├── __init__.py
│ │ │ ├── middleware.py
│ │ │ └── ssl_wrapper.py
│ │ ├── plugins/
│ │ │ ├── __init__.py
│ │ │ ├── common/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── shim/
│ │ │ │ │ └── __init__.py
│ │ │ │ └── utils.py
│ │ │ ├── north/
│ │ │ │ ├── README.rst
│ │ │ │ ├── __init__.py
│ │ │ │ ├── common/
│ │ │ │ │ ├── README.rst
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── common.py
│ │ │ │ │ └── exceptions.py
│ │ │ │ └── empty/
│ │ │ │ ├── README.rst
│ │ │ │ ├── __init__.py
│ │ │ │ └── empty.py
│ │ │ └── storage/
│ │ │ ├── __init__.py
│ │ │ ├── common/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── backup.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── lib.py
│ │ │ │ └── restore.py
│ │ │ ├── postgres/
│ │ │ │ ├── __init__.py
│ │ │ │ └── backup_restore/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── backup_postgres.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── lib.py
│ │ │ │ └── restore_postgres.py
│ │ │ └── sqlite/
│ │ │ ├── __init__.py
│ │ │ └── backup_restore/
│ │ │ ├── __init__.py
│ │ │ ├── backup_sqlite.py
│ │ │ └── restore_sqlite.py
│ │ ├── services/
│ │ │ ├── __init__.py
│ │ │ ├── common/
│ │ │ │ ├── README.rst
│ │ │ │ ├── __init__.py
│ │ │ │ ├── microservice.py
│ │ │ │ ├── microservice_management/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── routes.py
│ │ │ │ ├── service_announcer.py
│ │ │ │ └── utils.py
│ │ │ ├── core/
│ │ │ │ ├── README.rst
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __main__.py
│ │ │ │ ├── api/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── alerts.py
│ │ │ │ │ ├── asset_tracker.py
│ │ │ │ │ ├── audit.py
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── backup_restore.py
│ │ │ │ │ ├── browser.py
│ │ │ │ │ ├── certificate_store.py
│ │ │ │ │ ├── common.py
│ │ │ │ │ ├── configuration.py
│ │ │ │ │ ├── control_service/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── acl_management.py
│ │ │ │ │ │ ├── entrypoint.py
│ │ │ │ │ │ ├── exceptions.py
│ │ │ │ │ │ ├── pipeline.py
│ │ │ │ │ │ └── script_management.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── filters.py
│ │ │ │ │ ├── health.py
│ │ │ │ │ ├── north.py
│ │ │ │ │ ├── notification.py
│ │ │ │ │ ├── package_log.py
│ │ │ │ │ ├── performance_monitor.py
│ │ │ │ │ ├── pipeline_debugger.py
│ │ │ │ │ ├── plugins/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── common.py
│ │ │ │ │ │ ├── config_validator.py
│ │ │ │ │ │ ├── data.py
│ │ │ │ │ │ ├── discovery.py
│ │ │ │ │ │ ├── exceptions.py
│ │ │ │ │ │ ├── install.py
│ │ │ │ │ │ ├── remove.py
│ │ │ │ │ │ └── update.py
│ │ │ │ │ ├── python_packages.py
│ │ │ │ │ ├── repos/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── configure.py
│ │ │ │ │ ├── scheduler.py
│ │ │ │ │ ├── service.py
│ │ │ │ │ ├── snapshot/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── plugins.py
│ │ │ │ │ │ └── table.py
│ │ │ │ │ ├── south.py
│ │ │ │ │ ├── statistics.py
│ │ │ │ │ ├── support.py
│ │ │ │ │ ├── task.py
│ │ │ │ │ ├── update.py
│ │ │ │ │ └── utils.py
│ │ │ │ ├── asset_tracker/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── asset_tracker.py
│ │ │ │ ├── connect.py
│ │ │ │ ├── firewall.py
│ │ │ │ ├── interest_registry/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── change_callback.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── interest_record.py
│ │ │ │ │ └── interest_registry.py
│ │ │ │ ├── proxy.py
│ │ │ │ ├── routes.py
│ │ │ │ ├── scheduler/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── entities.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ └── scheduler.py
│ │ │ │ ├── server.py
│ │ │ │ ├── service_registry/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── monitor.py
│ │ │ │ │ └── service_registry.py
│ │ │ │ ├── snapshot.py
│ │ │ │ ├── support.py
│ │ │ │ └── user_model.py
│ │ │ └── south/
│ │ │ ├── __init__.py
│ │ │ └── exceptions.py
│ │ └── tasks/
│ │ ├── README.rst
│ │ ├── __init__.py
│ │ ├── automation_script/
│ │ │ ├── __init__.py
│ │ │ └── __main__.py
│ │ ├── common/
│ │ │ ├── README.rst
│ │ │ └── __init__.py
│ │ ├── purge/
│ │ │ ├── README.rst
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ └── purge.py
│ │ └── statistics/
│ │ ├── README.rst
│ │ ├── __init__.py
│ │ ├── __main__.py
│ │ └── statistics_history.py
│ ├── requirements-dev.txt
│ ├── requirements-test.txt
│ ├── requirements.txt
│ ├── setup.py
│ └── thirdparty/
│ └── README.rst
├── requirements.sh
├── scripts/
│ ├── __template__.sh
│ ├── auth_certificates
│ ├── certificates
│ ├── common/
│ │ ├── README.rst
│ │ ├── audittime.py
│ │ ├── check_schema_update.sh
│ │ ├── disk_usage.py
│ │ ├── get_engine_management.sh
│ │ ├── get_logs.sh
│ │ ├── get_platform.sh
│ │ ├── get_readings_plugin.sh
│ │ ├── get_storage_plugin.sh
│ │ ├── json_parse.py
│ │ ├── loglevel.py
│ │ ├── service_status.py
│ │ ├── try_catch.sh
│ │ └── write_log.sh
│ ├── debug/
│ │ ├── .debugrc
│ │ ├── README.rst
│ │ ├── attach
│ │ ├── buffer
│ │ ├── commands
│ │ ├── debug
│ │ ├── detach
│ │ ├── isolate
│ │ ├── replay
│ │ ├── resumeIngest
│ │ ├── setBuffer
│ │ ├── state
│ │ ├── step
│ │ ├── store
│ │ └── suspendIngest
│ ├── extras/
│ │ ├── fledge.sudoers
│ │ ├── fledge.sudoers_rh
│ │ ├── fledge_update
│ │ ├── fogbench
│ │ ├── update_task.apt
│ │ ├── update_task.snappy
│ │ └── update_task.yum
│ ├── fledge
│ ├── fledge_mnt
│ ├── package/
│ │ └── debian/
│ │ ├── package_update.sh
│ │ └── upgrade/
│ │ ├── 1.4.sh
│ │ ├── 1.5.sh
│ │ └── 1.8.sh
│ ├── plugins/
│ │ └── storage/
│ │ ├── postgres/
│ │ │ ├── downgrade/
│ │ │ │ ├── 1.sql
│ │ │ │ ├── 10.sql
│ │ │ │ ├── 11.sql
│ │ │ │ ├── 12.sql
│ │ │ │ ├── 13.sql
│ │ │ │ ├── 14.sql
│ │ │ │ ├── 15.sql
│ │ │ │ ├── 16.sql
│ │ │ │ ├── 17.sql
│ │ │ │ ├── 18.sql
│ │ │ │ ├── 19.sql
│ │ │ │ ├── 2.sql
│ │ │ │ ├── 20.sql
│ │ │ │ ├── 21.sql
│ │ │ │ ├── 22.sql
│ │ │ │ ├── 23.sql
│ │ │ │ ├── 24.sql
│ │ │ │ ├── 25.sql
│ │ │ │ ├── 26.sql
│ │ │ │ ├── 27.sql
│ │ │ │ ├── 28.sql
│ │ │ │ ├── 29.sql
│ │ │ │ ├── 3.sql
│ │ │ │ ├── 30.sql
│ │ │ │ ├── 31.sql
│ │ │ │ ├── 32.sql
│ │ │ │ ├── 33.sql
│ │ │ │ ├── 34.sql
│ │ │ │ ├── 35.sql
│ │ │ │ ├── 36.sql
│ │ │ │ ├── 37.sql
│ │ │ │ ├── 38.sql
│ │ │ │ ├── 39.sql
│ │ │ │ ├── 4.sql
│ │ │ │ ├── 40.sql
│ │ │ │ ├── 41.sql
│ │ │ │ ├── 42.sql
│ │ │ │ ├── 43.sql
│ │ │ │ ├── 44.sql
│ │ │ │ ├── 45.sql
│ │ │ │ ├── 46.sql
│ │ │ │ ├── 47.sql
│ │ │ │ ├── 48.sql
│ │ │ │ ├── 49.sql
│ │ │ │ ├── 5.sql
│ │ │ │ ├── 50.sql
│ │ │ │ ├── 51.sql
│ │ │ │ ├── 52.sql
│ │ │ │ ├── 53.sql
│ │ │ │ ├── 54.sql
│ │ │ │ ├── 55.sql
│ │ │ │ ├── 56.sql
│ │ │ │ ├── 57.sql
│ │ │ │ ├── 58.sql
│ │ │ │ ├── 59.sql
│ │ │ │ ├── 6.sql
│ │ │ │ ├── 60.sql
│ │ │ │ ├── 61.sql
│ │ │ │ ├── 62.sql
│ │ │ │ ├── 63.sql
│ │ │ │ ├── 64.sql
│ │ │ │ ├── 65.sql
│ │ │ │ ├── 66.sql
│ │ │ │ ├── 67.sql
│ │ │ │ ├── 68.sql
│ │ │ │ ├── 69.sql
│ │ │ │ ├── 7.sql
│ │ │ │ ├── 70.sql
│ │ │ │ ├── 71.sql
│ │ │ │ ├── 72.sql
│ │ │ │ ├── 73.sql
│ │ │ │ ├── 74.sql
│ │ │ │ ├── 75.sql
│ │ │ │ ├── 8.sql
│ │ │ │ ├── 9.sql
│ │ │ │ └── README
│ │ │ ├── init.sql
│ │ │ ├── schema_update.sh
│ │ │ └── upgrade/
│ │ │ ├── 10.sql
│ │ │ ├── 11.sql
│ │ │ ├── 12.sql
│ │ │ ├── 13.sql
│ │ │ ├── 14.sql
│ │ │ ├── 15.sql
│ │ │ ├── 16.sql
│ │ │ ├── 17.sql
│ │ │ ├── 18.sql
│ │ │ ├── 19.sql
│ │ │ ├── 2.sql
│ │ │ ├── 20.sql
│ │ │ ├── 21.sql
│ │ │ ├── 22.sql
│ │ │ ├── 23.sql
│ │ │ ├── 24.sql
│ │ │ ├── 25.sql
│ │ │ ├── 26.sql
│ │ │ ├── 27.sql
│ │ │ ├── 28.sql
│ │ │ ├── 29.sql
│ │ │ ├── 3.sql
│ │ │ ├── 30.sql
│ │ │ ├── 31.sql
│ │ │ ├── 32.sql
│ │ │ ├── 33.sql
│ │ │ ├── 34.sql
│ │ │ ├── 35.sql
│ │ │ ├── 36.sql
│ │ │ ├── 37.sql
│ │ │ ├── 38.sql
│ │ │ ├── 39.sql
│ │ │ ├── 4.sql
│ │ │ ├── 40.sql
│ │ │ ├── 41.sql
│ │ │ ├── 42.sql
│ │ │ ├── 43.sql
│ │ │ ├── 44.sql
│ │ │ ├── 45.sql
│ │ │ ├── 46.sql
│ │ │ ├── 47.sql
│ │ │ ├── 48.sql
│ │ │ ├── 49.sql
│ │ │ ├── 5.sql
│ │ │ ├── 50.sql
│ │ │ ├── 51.sql
│ │ │ ├── 52.sql
│ │ │ ├── 53.sql
│ │ │ ├── 54.sql
│ │ │ ├── 55.sql
│ │ │ ├── 56.sql
│ │ │ ├── 57.sql
│ │ │ ├── 58.sql
│ │ │ ├── 59.sql
│ │ │ ├── 6.sql
│ │ │ ├── 60.sql
│ │ │ ├── 61.sql
│ │ │ ├── 62.sql
│ │ │ ├── 63.sql
│ │ │ ├── 64.sql
│ │ │ ├── 65.sql
│ │ │ ├── 66.sql
│ │ │ ├── 67.sql
│ │ │ ├── 68.sql
│ │ │ ├── 69.sql
│ │ │ ├── 7.sql
│ │ │ ├── 70.sql
│ │ │ ├── 71.sql
│ │ │ ├── 72.sql
│ │ │ ├── 73.sql
│ │ │ ├── 74.sql
│ │ │ ├── 75.sql
│ │ │ ├── 76.sql
│ │ │ ├── 8.sql
│ │ │ ├── 9.sql
│ │ │ └── README
│ │ ├── postgres.sh
│ │ ├── sqlite/
│ │ │ ├── downgrade/
│ │ │ │ ├── 1.sql
│ │ │ │ ├── 10.sql
│ │ │ │ ├── 11.sql
│ │ │ │ ├── 12.sql
│ │ │ │ ├── 13.sql
│ │ │ │ ├── 14.sql
│ │ │ │ ├── 15.sql
│ │ │ │ ├── 16.sql
│ │ │ │ ├── 17.sql
│ │ │ │ ├── 18.sql
│ │ │ │ ├── 19.sql
│ │ │ │ ├── 2.sql
│ │ │ │ ├── 20.sql
│ │ │ │ ├── 21.sql
│ │ │ │ ├── 22.sql
│ │ │ │ ├── 23.sql
│ │ │ │ ├── 24.sql
│ │ │ │ ├── 25.sql
│ │ │ │ ├── 26.sql
│ │ │ │ ├── 27.sql
│ │ │ │ ├── 28.sql
│ │ │ │ ├── 29.sql
│ │ │ │ ├── 3.sql
│ │ │ │ ├── 30.sql
│ │ │ │ ├── 31.sql
│ │ │ │ ├── 32.sql
│ │ │ │ ├── 33.sql
│ │ │ │ ├── 34.sh
│ │ │ │ ├── 34.sql
│ │ │ │ ├── 35.sql
│ │ │ │ ├── 36.sql
│ │ │ │ ├── 37.sh
│ │ │ │ ├── 37.sql
│ │ │ │ ├── 38.sql
│ │ │ │ ├── 39.sql
│ │ │ │ ├── 4.sql
│ │ │ │ ├── 40.sql
│ │ │ │ ├── 41.sql
│ │ │ │ ├── 42.sql
│ │ │ │ ├── 43.sql
│ │ │ │ ├── 44.sql
│ │ │ │ ├── 45.sql
│ │ │ │ ├── 46.sql
│ │ │ │ ├── 47.sql
│ │ │ │ ├── 48.sql
│ │ │ │ ├── 49.sql
│ │ │ │ ├── 5.sql
│ │ │ │ ├── 50.sql
│ │ │ │ ├── 51.sql
│ │ │ │ ├── 52.sql
│ │ │ │ ├── 53.sql
│ │ │ │ ├── 54.sql
│ │ │ │ ├── 55.sql
│ │ │ │ ├── 56.sql
│ │ │ │ ├── 57.sql
│ │ │ │ ├── 58.sql
│ │ │ │ ├── 59.sql
│ │ │ │ ├── 6.sql
│ │ │ │ ├── 60.sql
│ │ │ │ ├── 61.sql
│ │ │ │ ├── 62.sql
│ │ │ │ ├── 63.sql
│ │ │ │ ├── 64.sql
│ │ │ │ ├── 65.sql
│ │ │ │ ├── 66.sql
│ │ │ │ ├── 67.sql
│ │ │ │ ├── 68.sql
│ │ │ │ ├── 69.sql
│ │ │ │ ├── 7.sql
│ │ │ │ ├── 70.sql
│ │ │ │ ├── 71.sql
│ │ │ │ ├── 72.sql
│ │ │ │ ├── 73.sql
│ │ │ │ ├── 74.sql
│ │ │ │ ├── 75.sql
│ │ │ │ ├── 8.sql
│ │ │ │ ├── 9.sql
│ │ │ │ └── README
│ │ │ ├── init.sql
│ │ │ ├── init_readings.sql
│ │ │ ├── schema_update.sh
│ │ │ └── upgrade/
│ │ │ ├── 10.sql
│ │ │ ├── 11.sql
│ │ │ ├── 12.sql
│ │ │ ├── 13.sql
│ │ │ ├── 14.sql
│ │ │ ├── 15.sql
│ │ │ ├── 16.sql
│ │ │ ├── 17.sql
│ │ │ ├── 18.sql
│ │ │ ├── 19.sql
│ │ │ ├── 2.sql
│ │ │ ├── 20.sql
│ │ │ ├── 21.sql
│ │ │ ├── 22.sql
│ │ │ ├── 23.sql
│ │ │ ├── 24.sql
│ │ │ ├── 25.sql
│ │ │ ├── 26.sql
│ │ │ ├── 27.sql
│ │ │ ├── 28.sql
│ │ │ ├── 29.sql
│ │ │ ├── 3.sql
│ │ │ ├── 30.sql
│ │ │ ├── 31.sql
│ │ │ ├── 32.sql
│ │ │ ├── 33.sql
│ │ │ ├── 34.sql
│ │ │ ├── 35.sh
│ │ │ ├── 35.sql
│ │ │ ├── 36.sql
│ │ │ ├── 37.sql
│ │ │ ├── 38.sh
│ │ │ ├── 38.sql
│ │ │ ├── 39.sql
│ │ │ ├── 4.sql
│ │ │ ├── 40.sql
│ │ │ ├── 41.sql
│ │ │ ├── 42.sql
│ │ │ ├── 43.sql
│ │ │ ├── 44.sql
│ │ │ ├── 45.sql
│ │ │ ├── 46.sql
│ │ │ ├── 47.sql
│ │ │ ├── 48.sql
│ │ │ ├── 49.sql
│ │ │ ├── 5.sql
│ │ │ ├── 50.sql
│ │ │ ├── 51.sql
│ │ │ ├── 52.sql
│ │ │ ├── 53.sql
│ │ │ ├── 54.sql
│ │ │ ├── 55.sql
│ │ │ ├── 56.sql
│ │ │ ├── 57.sql
│ │ │ ├── 58.sql
│ │ │ ├── 59.sql
│ │ │ ├── 6.sql
│ │ │ ├── 60.sql
│ │ │ ├── 61.sql
│ │ │ ├── 62.sql
│ │ │ ├── 63.sql
│ │ │ ├── 64.sql
│ │ │ ├── 65.sql
│ │ │ ├── 66.sql
│ │ │ ├── 67.sql
│ │ │ ├── 68.sql
│ │ │ ├── 69.sql
│ │ │ ├── 7.sql
│ │ │ ├── 70.sql
│ │ │ ├── 71.sql
│ │ │ ├── 72.sql
│ │ │ ├── 73.sql
│ │ │ ├── 74.sql
│ │ │ ├── 75.sql
│ │ │ ├── 76.sql
│ │ │ ├── 8.sql
│ │ │ ├── 9.sql
│ │ │ └── README
│ │ ├── sqlite.sh
│ │ ├── sqlitelb/
│ │ │ ├── downgrade/
│ │ │ │ ├── 42.sql
│ │ │ │ ├── 43.sql
│ │ │ │ ├── 44.sql
│ │ │ │ ├── 45.sql
│ │ │ │ ├── 46.sql
│ │ │ │ ├── 47.sql
│ │ │ │ ├── 48.sql
│ │ │ │ ├── 49.sql
│ │ │ │ ├── 50.sql
│ │ │ │ ├── 51.sql
│ │ │ │ ├── 52.sql
│ │ │ │ ├── 53.sql
│ │ │ │ ├── 54.sql
│ │ │ │ ├── 55.sql
│ │ │ │ ├── 56.sql
│ │ │ │ ├── 57.sql
│ │ │ │ ├── 58.sql
│ │ │ │ ├── 59.sql
│ │ │ │ ├── 60.sql
│ │ │ │ ├── 61.sql
│ │ │ │ ├── 62.sql
│ │ │ │ ├── 63.sql
│ │ │ │ ├── 64.sql
│ │ │ │ ├── 65.sql
│ │ │ │ ├── 66.sql
│ │ │ │ ├── 67.sql
│ │ │ │ ├── 68.sql
│ │ │ │ ├── 69.sql
│ │ │ │ ├── 70.sql
│ │ │ │ ├── 71.sql
│ │ │ │ ├── 72.sql
│ │ │ │ ├── 73.sql
│ │ │ │ ├── 74.sql
│ │ │ │ ├── 75.sql
│ │ │ │ └── README
│ │ │ ├── init.sql
│ │ │ ├── init_readings.sql
│ │ │ ├── schema_update.sh
│ │ │ └── upgrade/
│ │ │ ├── 43.sql
│ │ │ ├── 44.sql
│ │ │ ├── 45.sql
│ │ │ ├── 46.sql
│ │ │ ├── 47.sql
│ │ │ ├── 48.sql
│ │ │ ├── 49.sql
│ │ │ ├── 50.sql
│ │ │ ├── 51.sql
│ │ │ ├── 52.sql
│ │ │ ├── 53.sql
│ │ │ ├── 54.sql
│ │ │ ├── 55.sql
│ │ │ ├── 56.sql
│ │ │ ├── 57.sql
│ │ │ ├── 58.sql
│ │ │ ├── 59.sql
│ │ │ ├── 60.sql
│ │ │ ├── 61.sql
│ │ │ ├── 62.sql
│ │ │ ├── 63.sql
│ │ │ ├── 64.sql
│ │ │ ├── 65.sql
│ │ │ ├── 66.sql
│ │ │ ├── 67.sql
│ │ │ ├── 68.sql
│ │ │ ├── 69.sql
│ │ │ ├── 70.sql
│ │ │ ├── 71.sql
│ │ │ ├── 72.sql
│ │ │ ├── 73.sql
│ │ │ ├── 74.sql
│ │ │ ├── 75.sql
│ │ │ ├── 76.sql
│ │ │ └── README
│ │ └── sqlitelb.sh
│ ├── services/
│ │ ├── README.rst
│ │ ├── bucket_storage_c
│ │ ├── dispatcher_c
│ │ ├── north_C
│ │ ├── notification_c
│ │ ├── pipeline_c
│ │ ├── south_c
│ │ └── storage
│ ├── storage
│ └── tasks/
│ ├── README.rst
│ ├── automation_script
│ ├── backup
│ ├── check_certs
│ ├── check_updates
│ ├── north_c
│ ├── purge
│ ├── purge_system
│ ├── restore
│ └── statistics
├── tests/
│ ├── .gitignore
│ ├── README.rst
│ ├── __init__.py
│ ├── system/
│ │ ├── __init__.py
│ │ ├── common/
│ │ │ ├── clean_pi_system.py
│ │ │ └── scripts/
│ │ │ └── reset_user_authentication
│ │ ├── lab/
│ │ │ ├── README.rst
│ │ │ ├── check_env
│ │ │ ├── install
│ │ │ ├── remove
│ │ │ ├── reset
│ │ │ ├── run
│ │ │ ├── run_until_fails
│ │ │ ├── scripts/
│ │ │ │ ├── ema.py
│ │ │ │ ├── flash_leds.py
│ │ │ │ ├── trendc.py
│ │ │ │ └── write_out.py
│ │ │ ├── test
│ │ │ ├── test.config
│ │ │ └── verify_clean_pi.py
│ │ ├── memory_leak/
│ │ │ ├── config.sh
│ │ │ ├── scripts/
│ │ │ │ ├── log_analyzer
│ │ │ │ ├── reset
│ │ │ │ └── setup
│ │ │ ├── test_memcheck.sh
│ │ │ └── valgrind-python.supp
│ │ ├── plugins/
│ │ │ ├── README.rst
│ │ │ └── south/
│ │ │ └── fledge-south-testcard/
│ │ │ ├── .gitignore
│ │ │ ├── CMakeLists.txt
│ │ │ ├── Description
│ │ │ ├── FindFledge.cmake
│ │ │ ├── LICENSE
│ │ │ ├── Package
│ │ │ ├── README.rst
│ │ │ ├── VERSION
│ │ │ ├── fledge.version
│ │ │ ├── mkversion
│ │ │ ├── plugin.cpp
│ │ │ └── requirements.sh
│ │ └── python/
│ │ ├── README.rst
│ │ ├── api/
│ │ │ ├── control_service/
│ │ │ │ ├── test_entrypoint.py
│ │ │ │ └── test_pipeline.py
│ │ │ ├── test_alerts.py
│ │ │ ├── test_audit.py
│ │ │ ├── test_authentication.py
│ │ │ ├── test_browser_assets.py
│ │ │ ├── test_common.py
│ │ │ ├── test_configuration.py
│ │ │ ├── test_endpoints_with_different_user_types.py
│ │ │ ├── test_notification.py
│ │ │ ├── test_passwords.py
│ │ │ ├── test_plugin_discovery.py
│ │ │ ├── test_service.py
│ │ │ └── test_statistics.py
│ │ ├── conftest.py
│ │ ├── data/
│ │ │ ├── dummyplugin.py
│ │ │ ├── notify35.py
│ │ │ ├── vibration.csv
│ │ │ └── wind-data.csv
│ │ ├── e2e/
│ │ │ ├── docs/
│ │ │ │ ├── test_e2e_coap_PI.rst
│ │ │ │ ├── test_e2e_csv_PI.rst
│ │ │ │ ├── test_e2e_csv_multi_filter_pi.rst
│ │ │ │ ├── test_e2e_expr_pi.rst
│ │ │ │ ├── test_e2e_filter_fft_threshold.rst
│ │ │ │ ├── test_e2e_kafka.rst
│ │ │ │ ├── test_e2e_modbus_c_pi.rst
│ │ │ │ ├── test_e2e_notification_service_with_plugins.rst
│ │ │ │ └── test_south_service_tuning.rst
│ │ │ ├── test_e2e_coap_OCS.py
│ │ │ ├── test_e2e_coap_PI.py
│ │ │ ├── test_e2e_csv_PI.py
│ │ │ ├── test_e2e_csv_multi_filter_pi.py
│ │ │ ├── test_e2e_expr_pi.py
│ │ │ ├── test_e2e_filter_fft_threshold.py
│ │ │ ├── test_e2e_kafka.py
│ │ │ ├── test_e2e_modbus_c_pi.py
│ │ │ ├── test_e2e_modbus_c_rtu_pi.py
│ │ │ ├── test_e2e_notification_service_with_plugins.py
│ │ │ ├── test_e2e_pi_scaleset.py
│ │ │ ├── test_e2e_vary_asset_http_pi.py
│ │ │ └── test_south_service_tuning.py
│ │ ├── fledge/
│ │ │ └── plugins/
│ │ │ ├── filter/
│ │ │ │ └── imageblock/
│ │ │ │ ├── README.rst
│ │ │ │ ├── __init__.py
│ │ │ │ └── imageblock.py
│ │ │ └── south/
│ │ │ └── imagetest/
│ │ │ ├── __init__.py
│ │ │ ├── imagetest.py
│ │ │ └── readme.rst
│ │ ├── helpers/
│ │ │ └── utils.py
│ │ ├── iprpc/
│ │ │ ├── README.rst
│ │ │ └── test_iprpc.py
│ │ ├── packages/
│ │ │ ├── README.rst
│ │ │ ├── data/
│ │ │ │ ├── package_list.json
│ │ │ │ ├── readings35.py
│ │ │ │ └── set_id.py
│ │ │ ├── docs/
│ │ │ │ ├── test_authentication.rst
│ │ │ │ ├── test_filters.rst
│ │ │ │ ├── test_multiple_assets.rst
│ │ │ │ ├── test_north_azure.rst
│ │ │ │ ├── test_north_pi_webapi_nw_throttle.rst
│ │ │ │ ├── test_omf_naming_scheme.rst
│ │ │ │ ├── test_omf_north_service.rst
│ │ │ │ ├── test_pi_webapi.rst
│ │ │ │ ├── test_pi_webapi_linked_data_type.rst
│ │ │ │ ├── test_rule_data_availability.rst
│ │ │ │ └── test_statistics_history_notification_rule.rst
│ │ │ ├── network_impairment.py
│ │ │ ├── test_authentication.py
│ │ │ ├── test_available_and_install_api.py
│ │ │ ├── test_eds.py
│ │ │ ├── test_filters.py
│ │ │ ├── test_lab.py
│ │ │ ├── test_multiple_assets.py
│ │ │ ├── test_north_azure.py
│ │ │ ├── test_north_pi_webapi_nw_throttle.py
│ │ │ ├── test_omf_naming_scheme.py
│ │ │ ├── test_omf_north_service.py
│ │ │ ├── test_opcua.py
│ │ │ ├── test_pi_webapi.py
│ │ │ ├── test_pi_webapi_linked_data_type.py
│ │ │ ├── test_rule_data_availability.py
│ │ │ └── test_statistics_history_notification_rule.py
│ │ ├── pair/
│ │ │ ├── docs/
│ │ │ │ ├── test_c_north_service_pair.rst
│ │ │ │ ├── test_e2e_fledge_pair.rst
│ │ │ │ └── test_python_north_service_pair.rst
│ │ │ ├── test_c_north_service_pair.py
│ │ │ ├── test_e2e_fledge_pair.py
│ │ │ └── test_python_north_service_pair.py
│ │ ├── plugin_and_service.py
│ │ ├── plugins/
│ │ │ ├── dummy/
│ │ │ │ └── iprpc/
│ │ │ │ ├── filter/
│ │ │ │ │ ├── numpy_filter/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── numpy_filter.py
│ │ │ │ │ └── numpy_iprpc_filter/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── np_server.py
│ │ │ │ │ └── numpy_iprpc_filter.py
│ │ │ │ └── south/
│ │ │ │ └── numpy_south/
│ │ │ │ ├── __init__.py
│ │ │ │ └── numpy_south.py
│ │ │ ├── notificationDelivery/
│ │ │ │ └── send/
│ │ │ │ └── send.py
│ │ │ └── notificationRule/
│ │ │ └── numpy_image/
│ │ │ └── numpy_image.py
│ │ ├── pytest.ini
│ │ ├── rpi/
│ │ │ └── test_e2e_rpi_ephat.py
│ │ ├── scripts/
│ │ │ ├── install_c_plugin
│ │ │ ├── install_c_service
│ │ │ ├── install_python_plugin
│ │ │ ├── package/
│ │ │ │ ├── remove
│ │ │ │ ├── reset
│ │ │ │ └── setup
│ │ │ └── reset_plugins
│ │ └── smoke/
│ │ └── test_smoke.py
│ └── unit/
│ ├── C/
│ │ ├── CMakeLists.txt
│ │ ├── CodeCoverage.cmake
│ │ ├── README.rst
│ │ ├── cmake_pg/
│ │ │ ├── CMakeLists.txt
│ │ │ └── CheckRhPg.cmake
│ │ ├── cmake_sqlite/
│ │ │ ├── CMakeLists.txt
│ │ │ └── Findsqlite3.cmake
│ │ ├── cmake_sqliteM/
│ │ │ ├── CMakeLists.txt
│ │ │ └── Findsqlite3.cmake
│ │ ├── cmake_sqlitelb/
│ │ │ ├── CMakeLists.txt
│ │ │ └── Findsqlite3.cmake
│ │ ├── common/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── main.cpp
│ │ │ ├── test_JSONPath.cpp
│ │ │ ├── test_circular_buffer.cpp
│ │ │ ├── test_config_category.cpp
│ │ │ ├── test_createDirectory.cpp
│ │ │ ├── test_default_config_category.cpp
│ │ │ ├── test_expression.cpp
│ │ │ ├── test_imageencode.cpp
│ │ │ ├── test_insert_value.cpp
│ │ │ ├── test_json_reading.cpp
│ │ │ ├── test_json_utils.cpp
│ │ │ ├── test_log_interceptor.cpp
│ │ │ ├── test_purge_result.cpp
│ │ │ ├── test_python_reading.cpp
│ │ │ ├── test_python_reading_set.cpp
│ │ │ ├── test_python_readingnumpy.cpp
│ │ │ ├── test_query.cpp
│ │ │ ├── test_reading.cpp
│ │ │ ├── test_reading_array.cpp
│ │ │ ├── test_reading_set.cpp
│ │ │ ├── test_readingset_merge.cpp
│ │ │ ├── test_resultset.cpp
│ │ │ ├── test_service_record.cpp
│ │ │ └── test_string_utils.cpp
│ │ ├── plugins/
│ │ │ ├── common/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── main.cpp
│ │ │ │ ├── test_omf_translation.cpp
│ │ │ │ └── test_omf_translation_piwebapi.cpp
│ │ │ └── storage/
│ │ │ ├── common/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── README.rst
│ │ │ │ └── tests.cpp
│ │ │ ├── postgres/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── CheckRhPg.cmake
│ │ │ │ ├── README.rst
│ │ │ │ └── tests.cpp
│ │ │ ├── sqlite/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── README.rst
│ │ │ │ └── tests.cpp
│ │ │ ├── sqlitelb/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── README.rst
│ │ │ │ └── tests.cpp
│ │ │ └── sqlitememory/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── README.rst
│ │ │ └── sqlmem_tests.cpp
│ │ ├── requirements.sh
│ │ ├── scripts/
│ │ │ └── RunAllTests.sh
│ │ └── services/
│ │ ├── core/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── main.cpp
│ │ │ ├── reading_set_copy.cpp
│ │ │ └── test_service_regsitery.cpp
│ │ └── storage/
│ │ ├── postgres/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── DeleteRows.json
│ │ │ ├── GetTable.json
│ │ │ ├── PostStorageSchema.json
│ │ │ ├── PostTable.json
│ │ │ ├── PutQuery.json
│ │ │ ├── PutTable.json
│ │ │ ├── PutTableExpression.json
│ │ │ ├── README.rst
│ │ │ ├── expected_ETC_UTC/
│ │ │ │ ├── 1
│ │ │ │ ├── 10
│ │ │ │ ├── 100
│ │ │ │ ├── 101
│ │ │ │ ├── 102
│ │ │ │ ├── 103
│ │ │ │ ├── 104
│ │ │ │ ├── 105
│ │ │ │ ├── 106
│ │ │ │ ├── 107
│ │ │ │ ├── 108
│ │ │ │ ├── 109
│ │ │ │ ├── 11
│ │ │ │ ├── 110
│ │ │ │ ├── 111
│ │ │ │ ├── 112
│ │ │ │ ├── 113
│ │ │ │ ├── 115
│ │ │ │ ├── 116
│ │ │ │ ├── 12
│ │ │ │ ├── 13
│ │ │ │ ├── 14
│ │ │ │ ├── 15
│ │ │ │ ├── 16
│ │ │ │ ├── 17
│ │ │ │ ├── 18
│ │ │ │ ├── 19
│ │ │ │ ├── 2
│ │ │ │ ├── 20
│ │ │ │ ├── 21
│ │ │ │ ├── 22
│ │ │ │ ├── 23
│ │ │ │ ├── 24
│ │ │ │ ├── 25
│ │ │ │ ├── 26
│ │ │ │ ├── 27
│ │ │ │ ├── 28
│ │ │ │ ├── 29
│ │ │ │ ├── 3
│ │ │ │ ├── 30
│ │ │ │ ├── 31
│ │ │ │ ├── 32
│ │ │ │ ├── 33
│ │ │ │ ├── 34
│ │ │ │ ├── 35
│ │ │ │ ├── 37
│ │ │ │ ├── 38
│ │ │ │ ├── 39
│ │ │ │ ├── 4
│ │ │ │ ├── 40
│ │ │ │ ├── 41
│ │ │ │ ├── 42
│ │ │ │ ├── 43
│ │ │ │ ├── 44
│ │ │ │ ├── 45
│ │ │ │ ├── 46
│ │ │ │ ├── 47
│ │ │ │ ├── 48
│ │ │ │ ├── 49
│ │ │ │ ├── 5
│ │ │ │ ├── 50
│ │ │ │ ├── 51
│ │ │ │ ├── 52
│ │ │ │ ├── 53
│ │ │ │ ├── 54
│ │ │ │ ├── 55
│ │ │ │ ├── 56
│ │ │ │ ├── 57
│ │ │ │ ├── 58
│ │ │ │ ├── 59
│ │ │ │ ├── 6
│ │ │ │ ├── 60
│ │ │ │ ├── 61
│ │ │ │ ├── 62
│ │ │ │ ├── 63
│ │ │ │ ├── 64
│ │ │ │ ├── 65
│ │ │ │ ├── 66
│ │ │ │ ├── 67
│ │ │ │ ├── 68
│ │ │ │ ├── 69
│ │ │ │ ├── 7
│ │ │ │ ├── 70
│ │ │ │ ├── 71
│ │ │ │ ├── 72
│ │ │ │ ├── 73
│ │ │ │ ├── 74
│ │ │ │ ├── 75
│ │ │ │ ├── 76
│ │ │ │ ├── 77
│ │ │ │ ├── 78
│ │ │ │ ├── 79
│ │ │ │ ├── 8
│ │ │ │ ├── 80
│ │ │ │ ├── 81
│ │ │ │ ├── 82
│ │ │ │ ├── 83
│ │ │ │ ├── 84
│ │ │ │ ├── 85
│ │ │ │ ├── 86
│ │ │ │ ├── 87
│ │ │ │ ├── 88
│ │ │ │ ├── 89
│ │ │ │ ├── 9
│ │ │ │ ├── 90
│ │ │ │ ├── 91
│ │ │ │ ├── 92
│ │ │ │ ├── 93
│ │ │ │ ├── 94
│ │ │ │ ├── 95
│ │ │ │ ├── 96
│ │ │ │ ├── 97
│ │ │ │ ├── 98
│ │ │ │ └── 99
│ │ │ ├── expected_ETC_UTC_PG12/
│ │ │ │ ├── 1
│ │ │ │ ├── 10
│ │ │ │ ├── 100
│ │ │ │ ├── 101
│ │ │ │ ├── 102
│ │ │ │ ├── 103
│ │ │ │ ├── 104
│ │ │ │ ├── 105
│ │ │ │ ├── 106
│ │ │ │ ├── 107
│ │ │ │ ├── 108
│ │ │ │ ├── 109
│ │ │ │ ├── 11
│ │ │ │ ├── 110
│ │ │ │ ├── 111
│ │ │ │ ├── 112
│ │ │ │ ├── 113
│ │ │ │ ├── 115
│ │ │ │ ├── 116
│ │ │ │ ├── 12
│ │ │ │ ├── 13
│ │ │ │ ├── 14
│ │ │ │ ├── 15
│ │ │ │ ├── 16
│ │ │ │ ├── 17
│ │ │ │ ├── 18
│ │ │ │ ├── 19
│ │ │ │ ├── 2
│ │ │ │ ├── 20
│ │ │ │ ├── 21
│ │ │ │ ├── 22
│ │ │ │ ├── 23
│ │ │ │ ├── 24
│ │ │ │ ├── 25
│ │ │ │ ├── 26
│ │ │ │ ├── 27
│ │ │ │ ├── 28
│ │ │ │ ├── 29
│ │ │ │ ├── 3
│ │ │ │ ├── 30
│ │ │ │ ├── 31
│ │ │ │ ├── 32
│ │ │ │ ├── 33
│ │ │ │ ├── 34
│ │ │ │ ├── 35
│ │ │ │ ├── 37
│ │ │ │ ├── 38
│ │ │ │ ├── 39
│ │ │ │ ├── 4
│ │ │ │ ├── 40
│ │ │ │ ├── 41
│ │ │ │ ├── 42
│ │ │ │ ├── 43
│ │ │ │ ├── 44
│ │ │ │ ├── 45
│ │ │ │ ├── 46
│ │ │ │ ├── 47
│ │ │ │ ├── 48
│ │ │ │ ├── 49
│ │ │ │ ├── 5
│ │ │ │ ├── 50
│ │ │ │ ├── 51
│ │ │ │ ├── 52
│ │ │ │ ├── 53
│ │ │ │ ├── 54
│ │ │ │ ├── 55
│ │ │ │ ├── 56
│ │ │ │ ├── 57
│ │ │ │ ├── 58
│ │ │ │ ├── 59
│ │ │ │ ├── 6
│ │ │ │ ├── 60
│ │ │ │ ├── 61
│ │ │ │ ├── 62
│ │ │ │ ├── 63
│ │ │ │ ├── 64
│ │ │ │ ├── 65
│ │ │ │ ├── 66
│ │ │ │ ├── 67
│ │ │ │ ├── 68
│ │ │ │ ├── 69
│ │ │ │ ├── 7
│ │ │ │ ├── 70
│ │ │ │ ├── 71
│ │ │ │ ├── 72
│ │ │ │ ├── 73
│ │ │ │ ├── 74
│ │ │ │ ├── 75
│ │ │ │ ├── 76
│ │ │ │ ├── 77
│ │ │ │ ├── 78
│ │ │ │ ├── 79
│ │ │ │ ├── 8
│ │ │ │ ├── 80
│ │ │ │ ├── 81
│ │ │ │ ├── 82
│ │ │ │ ├── 83
│ │ │ │ ├── 84
│ │ │ │ ├── 85
│ │ │ │ ├── 86
│ │ │ │ ├── 87
│ │ │ │ ├── 88
│ │ │ │ ├── 89
│ │ │ │ ├── 9
│ │ │ │ ├── 90
│ │ │ │ ├── 91
│ │ │ │ ├── 92
│ │ │ │ ├── 93
│ │ │ │ ├── 94
│ │ │ │ ├── 95
│ │ │ │ ├── 96
│ │ │ │ ├── 97
│ │ │ │ ├── 98
│ │ │ │ └── 99
│ │ │ ├── expected_EUROPE_ROME/
│ │ │ │ ├── 1
│ │ │ │ ├── 10
│ │ │ │ ├── 100
│ │ │ │ ├── 101
│ │ │ │ ├── 102
│ │ │ │ ├── 103
│ │ │ │ ├── 104
│ │ │ │ ├── 105
│ │ │ │ ├── 106
│ │ │ │ ├── 107
│ │ │ │ ├── 108
│ │ │ │ ├── 109
│ │ │ │ ├── 11
│ │ │ │ ├── 110
│ │ │ │ ├── 111
│ │ │ │ ├── 112
│ │ │ │ ├── 113
│ │ │ │ ├── 115
│ │ │ │ ├── 116
│ │ │ │ ├── 12
│ │ │ │ ├── 13
│ │ │ │ ├── 14
│ │ │ │ ├── 15
│ │ │ │ ├── 16
│ │ │ │ ├── 17
│ │ │ │ ├── 18
│ │ │ │ ├── 19
│ │ │ │ ├── 2
│ │ │ │ ├── 20
│ │ │ │ ├── 21
│ │ │ │ ├── 22
│ │ │ │ ├── 23
│ │ │ │ ├── 24
│ │ │ │ ├── 25
│ │ │ │ ├── 26
│ │ │ │ ├── 27
│ │ │ │ ├── 28
│ │ │ │ ├── 29
│ │ │ │ ├── 3
│ │ │ │ ├── 30
│ │ │ │ ├── 31
│ │ │ │ ├── 32
│ │ │ │ ├── 33
│ │ │ │ ├── 34
│ │ │ │ ├── 35
│ │ │ │ ├── 37
│ │ │ │ ├── 38
│ │ │ │ ├── 39
│ │ │ │ ├── 4
│ │ │ │ ├── 40
│ │ │ │ ├── 41
│ │ │ │ ├── 42
│ │ │ │ ├── 43
│ │ │ │ ├── 44
│ │ │ │ ├── 45
│ │ │ │ ├── 46
│ │ │ │ ├── 47
│ │ │ │ ├── 48
│ │ │ │ ├── 49
│ │ │ │ ├── 5
│ │ │ │ ├── 50
│ │ │ │ ├── 51
│ │ │ │ ├── 52
│ │ │ │ ├── 53
│ │ │ │ ├── 54
│ │ │ │ ├── 55
│ │ │ │ ├── 56
│ │ │ │ ├── 57
│ │ │ │ ├── 58
│ │ │ │ ├── 59
│ │ │ │ ├── 6
│ │ │ │ ├── 60
│ │ │ │ ├── 61
│ │ │ │ ├── 62
│ │ │ │ ├── 63
│ │ │ │ ├── 64
│ │ │ │ ├── 65
│ │ │ │ ├── 66
│ │ │ │ ├── 67
│ │ │ │ ├── 68
│ │ │ │ ├── 69
│ │ │ │ ├── 7
│ │ │ │ ├── 70
│ │ │ │ ├── 71
│ │ │ │ ├── 72
│ │ │ │ ├── 73
│ │ │ │ ├── 74
│ │ │ │ ├── 75
│ │ │ │ ├── 76
│ │ │ │ ├── 77
│ │ │ │ ├── 78
│ │ │ │ ├── 79
│ │ │ │ ├── 8
│ │ │ │ ├── 80
│ │ │ │ ├── 81
│ │ │ │ ├── 82
│ │ │ │ ├── 83
│ │ │ │ ├── 84
│ │ │ │ ├── 85
│ │ │ │ ├── 86
│ │ │ │ ├── 87
│ │ │ │ ├── 88
│ │ │ │ ├── 89
│ │ │ │ ├── 9
│ │ │ │ ├── 90
│ │ │ │ ├── 91
│ │ │ │ ├── 92
│ │ │ │ ├── 93
│ │ │ │ ├── 94
│ │ │ │ ├── 95
│ │ │ │ ├── 96
│ │ │ │ ├── 97
│ │ │ │ ├── 98
│ │ │ │ └── 99
│ │ │ ├── expected_EUROPE_ROME_PG12/
│ │ │ │ ├── 1
│ │ │ │ ├── 10
│ │ │ │ ├── 100
│ │ │ │ ├── 101
│ │ │ │ ├── 102
│ │ │ │ ├── 103
│ │ │ │ ├── 104
│ │ │ │ ├── 105
│ │ │ │ ├── 106
│ │ │ │ ├── 107
│ │ │ │ ├── 108
│ │ │ │ ├── 109
│ │ │ │ ├── 11
│ │ │ │ ├── 110
│ │ │ │ ├── 111
│ │ │ │ ├── 112
│ │ │ │ ├── 113
│ │ │ │ ├── 115
│ │ │ │ ├── 116
│ │ │ │ ├── 12
│ │ │ │ ├── 13
│ │ │ │ ├── 14
│ │ │ │ ├── 15
│ │ │ │ ├── 16
│ │ │ │ ├── 17
│ │ │ │ ├── 18
│ │ │ │ ├── 19
│ │ │ │ ├── 2
│ │ │ │ ├── 20
│ │ │ │ ├── 21
│ │ │ │ ├── 22
│ │ │ │ ├── 23
│ │ │ │ ├── 24
│ │ │ │ ├── 25
│ │ │ │ ├── 26
│ │ │ │ ├── 27
│ │ │ │ ├── 28
│ │ │ │ ├── 29
│ │ │ │ ├── 3
│ │ │ │ ├── 30
│ │ │ │ ├── 31
│ │ │ │ ├── 32
│ │ │ │ ├── 33
│ │ │ │ ├── 34
│ │ │ │ ├── 35
│ │ │ │ ├── 37
│ │ │ │ ├── 38
│ │ │ │ ├── 39
│ │ │ │ ├── 4
│ │ │ │ ├── 40
│ │ │ │ ├── 41
│ │ │ │ ├── 42
│ │ │ │ ├── 43
│ │ │ │ ├── 44
│ │ │ │ ├── 45
│ │ │ │ ├── 46
│ │ │ │ ├── 47
│ │ │ │ ├── 48
│ │ │ │ ├── 49
│ │ │ │ ├── 5
│ │ │ │ ├── 50
│ │ │ │ ├── 51
│ │ │ │ ├── 52
│ │ │ │ ├── 53
│ │ │ │ ├── 54
│ │ │ │ ├── 55
│ │ │ │ ├── 56
│ │ │ │ ├── 57
│ │ │ │ ├── 58
│ │ │ │ ├── 59
│ │ │ │ ├── 6
│ │ │ │ ├── 60
│ │ │ │ ├── 61
│ │ │ │ ├── 62
│ │ │ │ ├── 63
│ │ │ │ ├── 64
│ │ │ │ ├── 65
│ │ │ │ ├── 66
│ │ │ │ ├── 67
│ │ │ │ ├── 68
│ │ │ │ ├── 69
│ │ │ │ ├── 7
│ │ │ │ ├── 70
│ │ │ │ ├── 71
│ │ │ │ ├── 72
│ │ │ │ ├── 73
│ │ │ │ ├── 74
│ │ │ │ ├── 75
│ │ │ │ ├── 76
│ │ │ │ ├── 77
│ │ │ │ ├── 78
│ │ │ │ ├── 79
│ │ │ │ ├── 8
│ │ │ │ ├── 80
│ │ │ │ ├── 81
│ │ │ │ ├── 82
│ │ │ │ ├── 83
│ │ │ │ ├── 84
│ │ │ │ ├── 85
│ │ │ │ ├── 86
│ │ │ │ ├── 87
│ │ │ │ ├── 88
│ │ │ │ ├── 89
│ │ │ │ ├── 9
│ │ │ │ ├── 90
│ │ │ │ ├── 91
│ │ │ │ ├── 92
│ │ │ │ ├── 93
│ │ │ │ ├── 94
│ │ │ │ ├── 95
│ │ │ │ ├── 96
│ │ │ │ ├── 97
│ │ │ │ ├── 98
│ │ │ │ └── 99
│ │ │ ├── makeReadings.sh
│ │ │ ├── payload1.json
│ │ │ ├── payload2.json
│ │ │ ├── payload3.json
│ │ │ ├── payload4.json
│ │ │ ├── payload5.json
│ │ │ ├── payload6.json
│ │ │ ├── payload7.json
│ │ │ ├── payload8.json
│ │ │ ├── payload9.json
│ │ │ ├── payloads/
│ │ │ │ ├── FOGL-983.json
│ │ │ │ ├── add_snapshot.json
│ │ │ │ ├── addnew.json
│ │ │ │ ├── asset.json
│ │ │ │ ├── bad_sort_1.json
│ │ │ │ ├── bad_sort_2.json
│ │ │ │ ├── bad_update.json
│ │ │ │ ├── badreadings.json
│ │ │ │ ├── count_assets.json
│ │ │ │ ├── delete.json
│ │ │ │ ├── fogl690-error.json
│ │ │ │ ├── fogl690-ok.json
│ │ │ │ ├── get-FOGL-983.json
│ │ │ │ ├── get_updated_complex_JSON.json
│ │ │ │ ├── group.json
│ │ │ │ ├── group_time.json
│ │ │ │ ├── insert.json
│ │ │ │ ├── insert2.json
│ │ │ │ ├── insert_bad.json
│ │ │ │ ├── insert_bad2.json
│ │ │ │ ├── limit.json
│ │ │ │ ├── limit_max_int.json
│ │ │ │ ├── msec_add_readings_user_ts.json
│ │ │ │ ├── msec_query_asset_aggmin.json
│ │ │ │ ├── msec_query_asset_aggminarray.json
│ │ │ │ ├── msec_query_asset_alias.json
│ │ │ │ ├── msec_query_asset_noalias.json
│ │ │ │ ├── msec_query_readings.json
│ │ │ │ ├── multi_and.json
│ │ │ │ ├── multi_mixed.json
│ │ │ │ ├── multi_or.json
│ │ │ │ ├── newer.json
│ │ │ │ ├── newerBad.json
│ │ │ │ ├── older.json
│ │ │ │ ├── put_function_in_JSON.json
│ │ │ │ ├── put_json_in_JSON.json
│ │ │ │ ├── query_readings.json
│ │ │ │ ├── query_readings_in.json
│ │ │ │ ├── query_readings_in_bad_values.json
│ │ │ │ ├── query_readings_not_in.json
│ │ │ │ ├── query_readings_timebucket.json
│ │ │ │ ├── query_readings_timebucket1.json
│ │ │ │ ├── query_readings_timebucket_bad.json
│ │ │ │ ├── query_timebucket_datapoints.json
│ │ │ │ ├── read_id_1xx.json
│ │ │ │ ├── reading_property.json
│ │ │ │ ├── reading_property_array.json
│ │ │ │ ├── reading_property_bad.json
│ │ │ │ ├── readings.json
│ │ │ │ ├── readings_timebucket.json
│ │ │ │ ├── skip.json
│ │ │ │ ├── skip_max_int.json
│ │ │ │ ├── sort.json
│ │ │ │ ├── sort2.json
│ │ │ │ ├── timezone.json
│ │ │ │ ├── timezone_bad.json
│ │ │ │ ├── update.json
│ │ │ │ ├── updateKey.json
│ │ │ │ ├── update_bad.json
│ │ │ │ ├── update_expression.json
│ │ │ │ ├── update_json.json
│ │ │ │ ├── update_json2.json
│ │ │ │ ├── where_avg.json
│ │ │ │ ├── where_bad_1.json
│ │ │ │ ├── where_bad_2.json
│ │ │ │ ├── where_bad_3.json
│ │ │ │ ├── where_bad_4.json
│ │ │ │ ├── where_bad_format1.json
│ │ │ │ ├── where_bad_format2.json
│ │ │ │ ├── where_count.json
│ │ │ │ ├── where_count_star.json
│ │ │ │ ├── where_distinct.json
│ │ │ │ ├── where_id_1.json
│ │ │ │ ├── where_id_1_r1.json
│ │ │ │ ├── where_id_1_r2.json
│ │ │ │ ├── where_id_1_r3.json
│ │ │ │ ├── where_id_2.json
│ │ │ │ ├── where_id_not_1.json
│ │ │ │ ├── where_in.json
│ │ │ │ ├── where_in_bad_values.json
│ │ │ │ ├── where_like.json
│ │ │ │ ├── where_max.json
│ │ │ │ ├── where_min.json
│ │ │ │ ├── where_multi_aggregatee.json
│ │ │ │ ├── where_not_in.json
│ │ │ │ ├── where_numeric_column.json
│ │ │ │ ├── where_sum.json
│ │ │ │ ├── where_test2_d1.json
│ │ │ │ ├── where_test2_d2.json
│ │ │ │ ├── where_test2_d3.json
│ │ │ │ ├── where_test2_d4.json
│ │ │ │ └── where_test2_d5.json
│ │ │ ├── plugins/
│ │ │ │ └── common/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── README.rst
│ │ │ │ └── tests.cpp
│ │ │ ├── storageSchemaTest.sh
│ │ │ ├── test1.sh
│ │ │ ├── test2.sh
│ │ │ ├── testCleanup.sh
│ │ │ ├── testRunner.sh
│ │ │ ├── testSetup.sh
│ │ │ ├── tests.cpp
│ │ │ └── testset
│ │ └── sqlite/
│ │ ├── README.rst
│ │ ├── expected_ETC_UTC/
│ │ │ ├── 1
│ │ │ ├── 10
│ │ │ ├── 100
│ │ │ ├── 101
│ │ │ ├── 102
│ │ │ ├── 103
│ │ │ ├── 104
│ │ │ ├── 105
│ │ │ ├── 106
│ │ │ ├── 107
│ │ │ ├── 108
│ │ │ ├── 109
│ │ │ ├── 11
│ │ │ ├── 110
│ │ │ ├── 111
│ │ │ ├── 112
│ │ │ ├── 113
│ │ │ ├── 114
│ │ │ ├── 115
│ │ │ ├── 116
│ │ │ ├── 117
│ │ │ ├── 118
│ │ │ ├── 119
│ │ │ ├── 12
│ │ │ ├── 120
│ │ │ ├── 121
│ │ │ ├── 122
│ │ │ ├── 123
│ │ │ ├── 124
│ │ │ ├── 125
│ │ │ ├── 126
│ │ │ ├── 127
│ │ │ ├── 128
│ │ │ ├── 13
│ │ │ ├── 14
│ │ │ ├── 15
│ │ │ ├── 16
│ │ │ ├── 17
│ │ │ ├── 18
│ │ │ ├── 19
│ │ │ ├── 2
│ │ │ ├── 20
│ │ │ ├── 21
│ │ │ ├── 22
│ │ │ ├── 23
│ │ │ ├── 24
│ │ │ ├── 25
│ │ │ ├── 26
│ │ │ ├── 27
│ │ │ ├── 28
│ │ │ ├── 29
│ │ │ ├── 3
│ │ │ ├── 30
│ │ │ ├── 31
│ │ │ ├── 32
│ │ │ ├── 33
│ │ │ ├── 34
│ │ │ ├── 35
│ │ │ ├── 37
│ │ │ ├── 38
│ │ │ ├── 39
│ │ │ ├── 4
│ │ │ ├── 40
│ │ │ ├── 41
│ │ │ ├── 42
│ │ │ ├── 43
│ │ │ ├── 44
│ │ │ ├── 45
│ │ │ ├── 46
│ │ │ ├── 47
│ │ │ ├── 48
│ │ │ ├── 49
│ │ │ ├── 5
│ │ │ ├── 50
│ │ │ ├── 51
│ │ │ ├── 52
│ │ │ ├── 53
│ │ │ ├── 54
│ │ │ ├── 55
│ │ │ ├── 56
│ │ │ ├── 57
│ │ │ ├── 58
│ │ │ ├── 59
│ │ │ ├── 6
│ │ │ ├── 60
│ │ │ ├── 61
│ │ │ ├── 62
│ │ │ ├── 63
│ │ │ ├── 64
│ │ │ ├── 65
│ │ │ ├── 66
│ │ │ ├── 67
│ │ │ ├── 68
│ │ │ ├── 69
│ │ │ ├── 7
│ │ │ ├── 70
│ │ │ ├── 71
│ │ │ ├── 72
│ │ │ ├── 73
│ │ │ ├── 74
│ │ │ ├── 75
│ │ │ ├── 76
│ │ │ ├── 77
│ │ │ ├── 78
│ │ │ ├── 79
│ │ │ ├── 8
│ │ │ ├── 80
│ │ │ ├── 81
│ │ │ ├── 82
│ │ │ ├── 83
│ │ │ ├── 84
│ │ │ ├── 85
│ │ │ ├── 86
│ │ │ ├── 87
│ │ │ ├── 88
│ │ │ ├── 89
│ │ │ ├── 9
│ │ │ ├── 90
│ │ │ ├── 91
│ │ │ ├── 92
│ │ │ ├── 93
│ │ │ ├── 94
│ │ │ ├── 95
│ │ │ ├── 96
│ │ │ ├── 97
│ │ │ ├── 98
│ │ │ └── 99
│ │ ├── expected_EUROPE_ROME/
│ │ │ ├── 1
│ │ │ ├── 10
│ │ │ ├── 100
│ │ │ ├── 101
│ │ │ ├── 102
│ │ │ ├── 103
│ │ │ ├── 104
│ │ │ ├── 105
│ │ │ ├── 106
│ │ │ ├── 107
│ │ │ ├── 108
│ │ │ ├── 109
│ │ │ ├── 11
│ │ │ ├── 110
│ │ │ ├── 111
│ │ │ ├── 112
│ │ │ ├── 113
│ │ │ ├── 114
│ │ │ ├── 115
│ │ │ ├── 116
│ │ │ ├── 117
│ │ │ ├── 118
│ │ │ ├── 119
│ │ │ ├── 12
│ │ │ ├── 120
│ │ │ ├── 121
│ │ │ ├── 122
│ │ │ ├── 123
│ │ │ ├── 124
│ │ │ ├── 125
│ │ │ ├── 126
│ │ │ ├── 127
│ │ │ ├── 128
│ │ │ ├── 13
│ │ │ ├── 14
│ │ │ ├── 15
│ │ │ ├── 16
│ │ │ ├── 17
│ │ │ ├── 18
│ │ │ ├── 19
│ │ │ ├── 2
│ │ │ ├── 20
│ │ │ ├── 21
│ │ │ ├── 22
│ │ │ ├── 23
│ │ │ ├── 24
│ │ │ ├── 25
│ │ │ ├── 26
│ │ │ ├── 27
│ │ │ ├── 28
│ │ │ ├── 29
│ │ │ ├── 3
│ │ │ ├── 30
│ │ │ ├── 31
│ │ │ ├── 32
│ │ │ ├── 33
│ │ │ ├── 34
│ │ │ ├── 35
│ │ │ ├── 37
│ │ │ ├── 38
│ │ │ ├── 39
│ │ │ ├── 4
│ │ │ ├── 40
│ │ │ ├── 41
│ │ │ ├── 42
│ │ │ ├── 43
│ │ │ ├── 44
│ │ │ ├── 45
│ │ │ ├── 46
│ │ │ ├── 47
│ │ │ ├── 48
│ │ │ ├── 49
│ │ │ ├── 5
│ │ │ ├── 50
│ │ │ ├── 51
│ │ │ ├── 52
│ │ │ ├── 53
│ │ │ ├── 54
│ │ │ ├── 55
│ │ │ ├── 56
│ │ │ ├── 57
│ │ │ ├── 58
│ │ │ ├── 59
│ │ │ ├── 6
│ │ │ ├── 60
│ │ │ ├── 61
│ │ │ ├── 62
│ │ │ ├── 63
│ │ │ ├── 64
│ │ │ ├── 65
│ │ │ ├── 66
│ │ │ ├── 67
│ │ │ ├── 68
│ │ │ ├── 69
│ │ │ ├── 7
│ │ │ ├── 70
│ │ │ ├── 71
│ │ │ ├── 72
│ │ │ ├── 73
│ │ │ ├── 74
│ │ │ ├── 75
│ │ │ ├── 76
│ │ │ ├── 77
│ │ │ ├── 78
│ │ │ ├── 79
│ │ │ ├── 8
│ │ │ ├── 80
│ │ │ ├── 81
│ │ │ ├── 82
│ │ │ ├── 83
│ │ │ ├── 84
│ │ │ ├── 85
│ │ │ ├── 86
│ │ │ ├── 87
│ │ │ ├── 88
│ │ │ ├── 89
│ │ │ ├── 9
│ │ │ ├── 90
│ │ │ ├── 91
│ │ │ ├── 92
│ │ │ ├── 93
│ │ │ ├── 94
│ │ │ ├── 95
│ │ │ ├── 96
│ │ │ ├── 97
│ │ │ ├── 98
│ │ │ └── 99
│ │ ├── makeReadings.sh
│ │ ├── payloads/
│ │ │ ├── FOGL-983.json
│ │ │ ├── add_readings_now.json
│ │ │ ├── add_snapshot.json
│ │ │ ├── addnew.json
│ │ │ ├── asset.json
│ │ │ ├── bad_sort_1.json
│ │ │ ├── bad_sort_2.json
│ │ │ ├── bad_update.json
│ │ │ ├── badreadings.json
│ │ │ ├── count_assets.json
│ │ │ ├── delete.json
│ │ │ ├── fogl690-error.json
│ │ │ ├── fogl690-ok.json
│ │ │ ├── get-FOGL-983.json
│ │ │ ├── group.json
│ │ │ ├── group_time.json
│ │ │ ├── insert.json
│ │ │ ├── insert2.json
│ │ │ ├── insert_1row.json
│ │ │ ├── insert_bad.json
│ │ │ ├── insert_bad2.json
│ │ │ ├── insert_multi_rows.json
│ │ │ ├── limit.json
│ │ │ ├── limit_max_int.json
│ │ │ ├── msec_add_readings_user_ts.json
│ │ │ ├── msec_query_asset_aggmin.json
│ │ │ ├── msec_query_asset_aggminarray.json
│ │ │ ├── msec_query_asset_alias.json
│ │ │ ├── msec_query_asset_noalias.json
│ │ │ ├── msec_query_readings.json
│ │ │ ├── multi_and.json
│ │ │ ├── multi_mixed.json
│ │ │ ├── multi_or.json
│ │ │ ├── newer.json
│ │ │ ├── newerBad.json
│ │ │ ├── older.json
│ │ │ ├── query_readings.json
│ │ │ ├── query_readings_in.json
│ │ │ ├── query_readings_in_bad_values.json
│ │ │ ├── query_readings_not_in.json
│ │ │ ├── query_readings_timebucket.json
│ │ │ ├── query_readings_timebucket1.json
│ │ │ ├── query_readings_timebucket_bad.json
│ │ │ ├── query_timebucket_datapoints.json
│ │ │ ├── read_id_1xx.json
│ │ │ ├── reading_property.json
│ │ │ ├── reading_property_array.json
│ │ │ ├── reading_property_bad.json
│ │ │ ├── readings.json
│ │ │ ├── readings_timebucket.json
│ │ │ ├── series_group_by_hours.json
│ │ │ ├── series_group_by_minutes.json
│ │ │ ├── series_seconds.json
│ │ │ ├── series_summary_seconds.json
│ │ │ ├── skip.json
│ │ │ ├── skip_max_int.json
│ │ │ ├── sort.json
│ │ │ ├── sort2.json
│ │ │ ├── timezone.json
│ │ │ ├── timezone_bad.json
│ │ │ ├── tz_all_insert.json
│ │ │ ├── tz_all_read_2.json
│ │ │ ├── tz_all_read_3.json
│ │ │ ├── tz_readings_insert.json
│ │ │ ├── tz_readings_read_2.json
│ │ │ ├── tz_readings_read_3.json
│ │ │ ├── tz_readings_read_4.json
│ │ │ ├── update.json
│ │ │ ├── updateKey.json
│ │ │ ├── update_bad.json
│ │ │ ├── update_expression.json
│ │ │ ├── update_json.json
│ │ │ ├── update_json2.json
│ │ │ ├── update_multi_rows.json
│ │ │ ├── updatenow.json
│ │ │ ├── where_avg.json
│ │ │ ├── where_bad_1.json
│ │ │ ├── where_bad_2.json
│ │ │ ├── where_bad_3.json
│ │ │ ├── where_bad_4.json
│ │ │ ├── where_bad_format1.json
│ │ │ ├── where_bad_format2.json
│ │ │ ├── where_count.json
│ │ │ ├── where_count_star.json
│ │ │ ├── where_distinct.json
│ │ │ ├── where_id_1.json
│ │ │ ├── where_id_1_r1.json
│ │ │ ├── where_id_1_r2.json
│ │ │ ├── where_id_1_r3.json
│ │ │ ├── where_id_2.json
│ │ │ ├── where_id_not_1.json
│ │ │ ├── where_in.json
│ │ │ ├── where_in_bad_values.json
│ │ │ ├── where_like.json
│ │ │ ├── where_max.json
│ │ │ ├── where_min.json
│ │ │ ├── where_multi_aggregatee.json
│ │ │ ├── where_not_in.json
│ │ │ ├── where_sum.json
│ │ │ ├── where_test2_d1.json
│ │ │ ├── where_test2_d2.json
│ │ │ ├── where_test2_d3.json
│ │ │ ├── where_test2_d4.json
│ │ │ └── where_test2_d5.json
│ │ ├── testCleanup.sh
│ │ ├── testRunner.sh
│ │ ├── testSetup.sh
│ │ └── testset
│ └── python/
│ ├── .coveragerc
│ ├── .pytest.ini
│ ├── README.rst
│ ├── __template__.py
│ └── fledge/
│ ├── common/
│ │ ├── configuration_manager_callback.py
│ │ ├── configuration_manager_callback_nonasync.py
│ │ ├── configuration_manager_callback_norun.py
│ │ ├── microservice_management_client/
│ │ │ └── test_microservice_management_client.py
│ │ ├── storage_client/
│ │ │ ├── data/
│ │ │ │ ├── payload_aggregate1.json
│ │ │ │ ├── payload_aggregate1_alias.json
│ │ │ │ ├── payload_aggregate2.json
│ │ │ │ ├── payload_aggregate2_alias.json
│ │ │ │ ├── payload_aggregate3.json
│ │ │ │ ├── payload_aggregate4.json
│ │ │ │ ├── payload_aggregate5.json
│ │ │ │ ├── payload_aggregate6.json
│ │ │ │ ├── payload_aggregate6_alias.json
│ │ │ │ ├── payload_aggregate7_alias.json
│ │ │ │ ├── payload_aggregate_all.json
│ │ │ │ ├── payload_aggregate_where.json
│ │ │ │ ├── payload_and_where1.json
│ │ │ │ ├── payload_and_where2.json
│ │ │ │ ├── payload_and_where_isnull.json
│ │ │ │ ├── payload_and_where_notnull.json
│ │ │ │ ├── payload_complex_select1.json
│ │ │ │ ├── payload_condition_in.json
│ │ │ │ ├── payload_condition_not_in.json
│ │ │ │ ├── payload_conditions1.json
│ │ │ │ ├── payload_conditions2.json
│ │ │ │ ├── payload_conditions3.json
│ │ │ │ ├── payload_conditions4.json
│ │ │ │ ├── payload_conditions5.json
│ │ │ │ ├── payload_conditions6.json
│ │ │ │ ├── payload_delete_where1.json
│ │ │ │ ├── payload_distinct.json
│ │ │ │ ├── payload_expr1.json
│ │ │ │ ├── payload_expr2.json
│ │ │ │ ├── payload_from1.json
│ │ │ │ ├── payload_from2.json
│ │ │ │ ├── payload_group_by1.json
│ │ │ │ ├── payload_group_by1_alias.json
│ │ │ │ ├── payload_group_by2.json
│ │ │ │ ├── payload_group_by2_alias.json
│ │ │ │ ├── payload_insert1.json
│ │ │ │ ├── payload_join_with_query.json
│ │ │ │ ├── payload_join_with_query_only_table_name.json
│ │ │ │ ├── payload_join_without_query.json
│ │ │ │ ├── payload_join_without_query_only_table_name.json
│ │ │ │ ├── payload_json_properties1.json
│ │ │ │ ├── payload_json_properties2.json
│ │ │ │ ├── payload_limit1.json
│ │ │ │ ├── payload_limit2.json
│ │ │ │ ├── payload_limit_offset1.json
│ │ │ │ ├── payload_limit_offset2.json
│ │ │ │ ├── payload_modifier_set_where.json
│ │ │ │ ├── payload_multiple_and_where_with_isnull.json
│ │ │ │ ├── payload_multiple_and_where_with_notnull.json
│ │ │ │ ├── payload_multiple_or_where_with_isnull.json
│ │ │ │ ├── payload_multiple_or_where_with_notnull.json
│ │ │ │ ├── payload_nested_join.json
│ │ │ │ ├── payload_newer_condition.json
│ │ │ │ ├── payload_offset1.json
│ │ │ │ ├── payload_offset2.json
│ │ │ │ ├── payload_older_condition.json
│ │ │ │ ├── payload_or_where1.json
│ │ │ │ ├── payload_or_where2.json
│ │ │ │ ├── payload_or_where_isnull.json
│ │ │ │ ├── payload_or_where_notnull.json
│ │ │ │ ├── payload_order_by1.json
│ │ │ │ ├── payload_order_by2.json
│ │ │ │ ├── payload_order_by3.json
│ │ │ │ ├── payload_select1.json
│ │ │ │ ├── payload_select1_alias.json
│ │ │ │ ├── payload_select2.json
│ │ │ │ ├── payload_select2_alias.json
│ │ │ │ ├── payload_select3_alias.json
│ │ │ │ ├── payload_select_alias_with_timezone.json
│ │ │ │ ├── payload_set1.json
│ │ │ │ ├── payload_timebucket1.json
│ │ │ │ ├── payload_timebucket2.json
│ │ │ │ ├── payload_timebucket3.json
│ │ │ │ ├── payload_timebucket4.json
│ │ │ │ ├── payload_update_set_where1.json
│ │ │ │ ├── payload_where_condition_isnull.json
│ │ │ │ └── payload_where_condition_notnull.json
│ │ │ ├── test_payload_builder.py
│ │ │ ├── test_sc_exceptions.py
│ │ │ ├── test_storage_client.py
│ │ │ └── test_utils.py
│ │ ├── test_alert_manager.py
│ │ ├── test_audit_logger.py
│ │ ├── test_common_utils.py
│ │ ├── test_configuration_cache.py
│ │ ├── test_configuration_manager.py
│ │ ├── test_configuration_validation_helpers.py
│ │ ├── test_logger.py
│ │ ├── test_plugin_discovery.py
│ │ ├── test_process.py
│ │ ├── test_service_record.py
│ │ ├── test_statistics.py
│ │ └── web/
│ │ ├── test_middleware.py
│ │ └── test_ssl_wrapper.py
│ ├── plugins/
│ │ ├── common/
│ │ │ └── test_plugins_common_utils.py
│ │ └── north/
│ │ └── common/
│ │ └── test_common.py
│ ├── services/
│ │ ├── common/
│ │ │ ├── microservice_management/
│ │ │ │ └── test_instance.py
│ │ │ ├── test_microservice.py
│ │ │ └── test_services_common_utils.py
│ │ └── core/
│ │ ├── api/
│ │ │ ├── certs/
│ │ │ │ ├── fledge.pem
│ │ │ │ ├── fledge.txt
│ │ │ │ ├── json/
│ │ │ │ │ └── test.json
│ │ │ │ └── pem/
│ │ │ │ └── fledge.pem
│ │ │ ├── control_service/
│ │ │ │ ├── test_acl_management.py
│ │ │ │ ├── test_entrypoint.py
│ │ │ │ ├── test_pipeline.py
│ │ │ │ └── test_script_management.py
│ │ │ ├── plugins/
│ │ │ │ ├── test_config_validator.py
│ │ │ │ ├── test_discovery.py
│ │ │ │ ├── test_install.py
│ │ │ │ ├── test_remove.py
│ │ │ │ └── test_update.py
│ │ │ ├── support/
│ │ │ │ └── .gitkeep
│ │ │ ├── test_alerts.py
│ │ │ ├── test_api_utils.py
│ │ │ ├── test_asset_tracker_api.py
│ │ │ ├── test_audit.py
│ │ │ ├── test_auth_mandatory.py
│ │ │ ├── test_auth_optional.py
│ │ │ ├── test_backup_restore.py
│ │ │ ├── test_browser_assets.py
│ │ │ ├── test_certificate_store.py
│ │ │ ├── test_common_ping.py
│ │ │ ├── test_configuration.py
│ │ │ ├── test_filters.py
│ │ │ ├── test_notification.py
│ │ │ ├── test_package_log.py
│ │ │ ├── test_scheduler_api.py
│ │ │ ├── test_service.py
│ │ │ ├── test_statistics_api.py
│ │ │ ├── test_support.py
│ │ │ └── test_task.py
│ │ ├── asset_tracker/
│ │ │ └── test_asset_tracker.py
│ │ ├── interest_registry/
│ │ │ ├── test_change_callback.py
│ │ │ └── test_interest_registry.py
│ │ ├── scheduler/
│ │ │ ├── test_scheduler.py
│ │ │ ├── test_scheduler_entities.py
│ │ │ └── test_scheduler_exceptions.py
│ │ ├── service_registry/
│ │ │ ├── test_exceptions.py
│ │ │ ├── test_monitor.py
│ │ │ └── test_service_registry.py
│ │ ├── test_connect.py
│ │ ├── test_main.py
│ │ ├── test_server.py
│ │ └── test_user_model.py
│ └── tasks/
│ ├── purge/
│ │ ├── test_purge.py
│ │ └── test_purge_main.py
│ └── statistics/
│ ├── test_statistics_history.py
│ └── test_statistics_main.py
└── tests-manual/
├── C/
│ └── services/
│ └── core/
│ ├── CMakeLists.txt
│ ├── README
│ ├── core_server.cpp
│ ├── expected/
│ │ ├── 1
│ │ ├── 10
│ │ ├── 11
│ │ ├── 12
│ │ ├── 13
│ │ ├── 14
│ │ ├── 15
│ │ ├── 16
│ │ ├── 17
│ │ ├── 18
│ │ ├── 19
│ │ ├── 2
│ │ ├── 20
│ │ ├── 21
│ │ ├── 22
│ │ ├── 23
│ │ ├── 3
│ │ ├── 4
│ │ ├── 5
│ │ ├── 6
│ │ ├── 7
│ │ ├── 8
│ │ └── 9
│ ├── main.cpp
│ ├── payloads/
│ │ ├── add_child_categories.json
│ │ ├── create_category.json
│ │ ├── create_category_a.json
│ │ ├── create_category_b.json
│ │ ├── create_category_update_b.json
│ │ ├── create_category_with_values.json
│ │ └── setvalue.json
│ ├── testRunner.sh
│ ├── testSetup.sh
│ ├── test_configuration_manager.cpp
│ └── testset
└── debugger/
├── .debugrc
├── README.rst
├── attach
├── buffer
├── commands
├── debug
├── detach
├── isolate
├── replay
├── resumeIngest
├── setBuffer
├── state
├── step
├── store
└── suspendIngest
Showing preview only (1,448K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (9840 symbols across 701 files)
FILE: C/common/JSONPath.cpp
function Value (line 43) | Value *JSONPath::findNode(Value& root)
FILE: C/common/aggregate.cpp
function string (line 21) | string Aggregate::toJSON()
FILE: C/common/asset_tracking.cpp
function worker (line 24) | static void worker(void *arg)
function AssetTracker (line 35) | AssetTracker *AssetTracker::getAssetTracker()
function AssetTrackingTuple (line 180) | AssetTrackingTuple* AssetTracker::findAssetTrackingCache(AssetTrackingTu...
function string (line 245) | string AssetTracker::getService(const std::string& event, const std::str...
function AssetTrackingTuple (line 312) | AssetTrackingTuple *AssetTrackingTable::find(const string& name)
function InsertValues (line 754) | InsertValues AssetTrackingTuple::processData(bool storage,
function InsertValues (line 799) | InsertValues StorageAssetTrackingTuple::processData(bool storage,
function StorageAssetTrackingTuple (line 868) | StorageAssetTrackingTuple* AssetTracker::findStorageAssetTrackingCache(S...
FILE: C/common/audit_logger.cpp
function AuditLogger (line 40) | AuditLogger *AuditLogger::getLogger()
FILE: C/common/base64databuffer.cpp
function string (line 60) | string Base64DataBuffer::encode()
FILE: C/common/base64image.cpp
function string (line 63) | string Base64DPImage::encode()
FILE: C/common/config_category.cpp
function string (line 101) | string ConfigCategoryDescription::toJSON() const
function string (line 115) | string ConfigCategories::toJSON() const
function ConfigCategory (line 221) | ConfigCategory& ConfigCategory::operator=(ConfigCategory const& rhs)
function ConfigCategory (line 241) | ConfigCategory& ConfigCategory::operator+=(ConfigCategory const& rhs)
function string (line 449) | string ConfigCategory::getValue(const string& name) const
function string (line 468) | string ConfigCategory::getValue(const std::string& name, const std::stri...
function string (line 717) | string ConfigCategory::getItemAttribute(const string& itemName,
function string (line 859) | string ConfigCategory::getType(const string& name) const
function string (line 878) | string ConfigCategory::getDescription(const string& name) const
function string (line 897) | string ConfigCategory::getDefault(const string& name) const
function string (line 957) | string ConfigCategory::getDisplayName(const string& name) const
function string (line 976) | string ConfigCategory::getLength(const string& name) const
function string (line 995) | string ConfigCategory::getMinimum(const string& name) const
function string (line 1014) | string ConfigCategory::getMaximum(const string& name) const
function string (line 1278) | string ConfigCategory::toJSON(const bool full) const
function string (line 1297) | string ConfigCategory::itemsToJSON(const bool full) const
function string (line 1915) | string ConfigCategory::CategoryItem::toJSON(const bool full) const
function string (line 2064) | string ConfigCategory::CategoryItem::defaultToJSON() const
function string (line 2253) | string DefaultConfigCategory::toJSON() const
function string (line 2270) | string DefaultConfigCategory::itemsToJSON() const
function string (line 2294) | string ConfigCategory::itemToJSON(const string& itemName) const
FILE: C/common/cryptography_utils.cpp
function compute_sha256 (line 23) | std::string compute_sha256(const std::string& input)
function compute_md5 (line 70) | std::string compute_md5(const std::string& input)
FILE: C/common/datapoint.cpp
function DatapointValue (line 253) | DatapointValue& DatapointValue::operator=(const DatapointValue& rhs)
FILE: C/common/datapoint_utility.cpp
function DatapointValue (line 68) | DatapointValue *DatapointUtility::findValueElement(Datapoints *dict, con...
function Datapoint (line 86) | Datapoint *DatapointUtility::findDatapointElement(Datapoints *dict, cons...
function string (line 106) | string DatapointUtility::findStringElement(Datapoints *dict, const strin...
function Datapoint (line 147) | Datapoint *DatapointUtility::createIntegerElement(Datapoints *dps, const...
function Datapoint (line 166) | Datapoint *DatapointUtility::createStringElement(Datapoints *dps, const ...
function Datapoint (line 185) | Datapoint *DatapointUtility::createDictOrListElement(Datapoints* dps, co...
function Datapoint (line 204) | Datapoint *DatapointUtility::createDictElement(Datapoints* dps, const st...
function Datapoint (line 215) | Datapoint *DatapointUtility::createListElement(Datapoints* dps, const st...
FILE: C/common/file_utils.cpp
function fileDeleteCallback (line 27) | static int fileDeleteCallback(const char *filePath, const struct stat *s...
function copyFile (line 39) | int copyFile(const char *to, const char *from)
function createDirectory (line 106) | void createDirectory(const std::string &directoryName)
function removeDirectory (line 139) | int removeDirectory(const char *path)
FILE: C/common/filter_pipeline.cpp
function PLUGIN_HANDLE (line 50) | PLUGIN_HANDLE FilterPipeline::loadFilterPlugin(const string& filterName)
function string (line 527) | string FilterPipeline::getDebuggerBuffer()
function string (line 543) | string FilterPipeline::getDebuggerBuffer(const vector<PipelineElement *>...
function string (line 575) | string FilterPipeline::getDebuggerBuffer(const string& name)
function string (line 601) | string FilterPipeline::readingsToJSON(vector<shared_ptr<Reading>> readings)
FILE: C/common/filter_plugin.cpp
function PLUGIN_HANDLE (line 82) | PLUGIN_HANDLE FilterPlugin::init(const ConfigCategory& config,
function string (line 111) | string FilterPlugin::shutdownSaveData()
FILE: C/common/image.cpp
function DPImage (line 68) | DPImage& DPImage::operator=(const DPImage& rhs)
FILE: C/common/include/JSONPath.h
function class (line 22) | class JSONPath {
FILE: C/common/include/acl.h
function class (line 23) | class ACL {
function class (line 84) | class ACLMalformed : public std::exception {
function class (line 95) | class ACLReasonMalformed : public std::exception {
FILE: C/common/include/aggregate.h
function class (line 18) | class Aggregate {
FILE: C/common/include/asset_tracking.h
function class (line 29) | class TrackingTuple {
function class (line 47) | class AssetTrackingTuple : public TrackingTuple {
type AssetTrackingTuplePtrEqual (line 102) | struct AssetTrackingTuplePtrEqual {
function namespace (line 108) | namespace std
function class (line 129) | class StorageAssetTrackingTuple : public TrackingTuple {
type StorageAssetTrackingTuplePtrEqual (line 190) | struct StorageAssetTrackingTuplePtrEqual {
function namespace (line 196) | namespace std
type std (line 223) | typedef std::unordered_map<StorageAssetTrackingTuple*,
type std (line 227) | typedef std::unordered_map<StorageAssetTrackingTuple*,
function class (line 239) | class AssetTracker {
function class (line 305) | class AssetTrackingTable {
FILE: C/common/include/audit_logger.h
function class (line 21) | class AuditLogger {
FILE: C/common/include/base64databuffer.h
function class (line 22) | class Base64DataBuffer : public DataBuffer {
FILE: C/common/include/base64dpimage.h
function class (line 22) | class Base64DPImage : public DPImage {
FILE: C/common/include/bearer_token.h
function class (line 24) | class BearerToken
FILE: C/common/include/config_category.h
function class (line 20) | class ConfigCategoryDescription {
function class (line 37) | class ConfigCategories {
function class (line 56) | class ConfigCategory {
function class (line 241) | class DefaultConfigCategory : public ConfigCategory
function class (line 253) | class ConfigCategoryChange : public ConfigCategory
function class (line 259) | class ConfigItemNotFound : public std::exception {
function class (line 267) | class ConfigMalformed : public std::exception {
function class (line 279) | class ConfigValueFoundWithDefault : public std::exception {
function class (line 302) | class ConfigItemAttributeNotFound : public std::exception {
function class (line 314) | class ConfigItemNotAList : public std::exception {
FILE: C/common/include/databuffer.h
function class (line 19) | class DataBuffer {
FILE: C/common/include/datapoint.h
function class (line 30) | class DatapointValue {
function DPImage (line 275) | DPImage *getImage()
function DataBuffer (line 283) | DataBuffer *getDataBuffer()
function std (line 290) | const std::string escape(const std::string& str) const;
function class (line 310) | class Datapoint {
FILE: C/common/include/datapoint_utility.h
function namespace (line 19) | namespace DatapointUtility {
FILE: C/common/include/dpimage.h
function class (line 21) | class DPImage {
FILE: C/common/include/expression.h
function class (line 22) | class Expression {
function class (line 68) | class ExpressionValues : public std::vector<Expression>
FILE: C/common/include/exprtk.hpp
type exprtk (line 69) | namespace exprtk
type details (line 94) | namespace details
function is_whitespace (line 103) | inline bool is_whitespace(const char_t c)
function is_operator_char (line 111) | inline bool is_operator_char(const char_t c)
function is_letter (line 126) | inline bool is_letter(const char_t c)
function is_digit (line 132) | inline bool is_digit(const char_t c)
function is_letter_or_digit (line 137) | inline bool is_letter_or_digit(const char_t c)
function is_left_bracket (line 142) | inline bool is_left_bracket(const char_t c)
function is_right_bracket (line 147) | inline bool is_right_bracket(const char_t c)
function is_bracket (line 152) | inline bool is_bracket(const char_t c)
function is_sign (line 157) | inline bool is_sign(const char_t c)
function is_invalid (line 162) | inline bool is_invalid(const char_t c)
function case_normalise (line 176) | inline void case_normalise(std::string& s)
function imatch (line 184) | inline bool imatch(const char_t c1, const char_t c2)
function imatch (line 189) | inline bool imatch(const std::string& s1, const std::string& s2)
type ilesscompare (line 207) | struct ilesscompare
function case_normalise (line 229) | inline void case_normalise(std::string&)
function imatch (line 232) | inline bool imatch(const char_t c1, const char_t c2)
function imatch (line 237) | inline bool imatch(const std::string& s1, const std::string& s2)
type ilesscompare (line 242) | struct ilesscompare
function is_valid_sf_symbol (line 251) | inline bool is_valid_sf_symbol(const std::string& symbol)
function char_t (line 261) | inline const char_t& front(const std::string& s)
function char_t (line 266) | inline const char_t& back(const std::string& s)
function to_str (line 271) | inline std::string to_str(int i)
function to_str (line 300) | inline std::string to_str(std::size_t i)
function is_hex_digit (line 305) | inline bool is_hex_digit(const std::string::value_type digit)
function uchar_t (line 312) | inline uchar_t hex_to_bin(uchar_t h)
function parse_hex (line 321) | inline void parse_hex(Iterator& itr, Iterator end, std::string::valu...
function cleanup_escapes (line 345) | inline void cleanup_escapes(std::string& s)
class build_string (line 391) | class build_string
method build_string (line 395) | build_string(const std::size_t& initial_size = 64)
method build_string (line 400) | inline build_string& operator << (const std::string& s)
method build_string (line 406) | inline build_string& operator << (char_cptr s)
method as_string (line 417) | inline std::string as_string() const
function is_reserved_word (line 510) | inline bool is_reserved_word(const std::string& symbol)
function is_reserved_symbol (line 523) | inline bool is_reserved_symbol(const std::string& symbol)
function is_base_function (line 536) | inline bool is_base_function(const std::string& function_name)
function is_control_struct (line 549) | inline bool is_control_struct(const std::string& cntrl_strct)
function is_logic_opr (line 562) | inline bool is_logic_opr(const std::string& lgc_opr)
type cs_match (line 575) | struct cs_match
method cmp (line 577) | static inline bool cmp(const char_t c0, const char_t c1)
type cis_match (line 583) | struct cis_match
method cmp (line 585) | static inline bool cmp(const char_t c0, const char_t c1)
function match_impl (line 592) | inline bool match_impl(const Iterator pattern_begin,
function wc_match (line 642) | inline bool wc_match(const std::string& wild_card,
function wc_imatch (line 653) | inline bool wc_imatch(const std::string& wild_card,
function sequence_match (line 664) | inline bool sequence_match(const std::string& pattern,
type numeric (line 744) | namespace numeric
type constant (line 746) | namespace constant
type details (line 760) | namespace details
type unknown_type_tag (line 762) | struct unknown_type_tag { unknown_type_tag() {} }
method unknown_type_tag (line 762) | unknown_type_tag() {}
type real_type_tag (line 763) | struct real_type_tag { real_type_tag () {} }
method real_type_tag (line 763) | real_type_tag () {}
type complex_type_tag (line 764) | struct complex_type_tag { complex_type_tag() {} }
method complex_type_tag (line 764) | complex_type_tag() {}
type int_type_tag (line 765) | struct int_type_tag { int_type_tag () {} }
method int_type_tag (line 765) | int_type_tag () {}
type number_type (line 768) | struct number_type
method number_type (line 771) | number_type() {}
type epsilon_type (line 805) | struct epsilon_type
method T (line 807) | static inline T value()
type epsilon_type <float> (line 815) | struct epsilon_type <float>
method value (line 817) | static inline float value()
type epsilon_type <long double> (line 825) | struct epsilon_type <long double>
method value (line 827) | static inline long double value()
function is_nan_impl (line 835) | inline bool is_nan_impl(const T v, real_type_tag)
function to_int32_impl (line 841) | inline int to_int32_impl(const T v, real_type_tag)
function to_int64_impl (line 847) | inline long long int to_int64_impl(const T v, real_type_tag)
function is_true_impl (line 853) | inline bool is_true_impl(const T v)
function is_false_impl (line 859) | inline bool is_false_impl(const T v)
function T (line 865) | inline T abs_impl(const T v, real_type_tag)
function T (line 871) | inline T min_impl(const T v0, const T v1, real_type_tag)
function T (line 877) | inline T max_impl(const T v0, const T v1, real_type_tag)
function T (line 883) | inline T equal_impl(const T v0, const T v1, real_type_tag)
function equal_impl (line 889) | inline float equal_impl(const float v0, const float v1, real_typ...
function T (line 896) | inline T equal_impl(const T v0, const T v1, int_type_tag)
function T (line 902) | inline T expm1_impl(const T v, real_type_tag)
function T (line 912) | inline T expm1_impl(const T v, int_type_tag)
function T (line 918) | inline T nequal_impl(const T v0, const T v1, real_type_tag)
function nequal_impl (line 925) | inline float nequal_impl(const float v0, const float v1, real_ty...
function T (line 933) | inline T nequal_impl(const T v0, const T v1, int_type_tag)
function T (line 939) | inline T modulus_impl(const T v0, const T v1, real_type_tag)
function T (line 945) | inline T modulus_impl(const T v0, const T v1, int_type_tag)
function T (line 951) | inline T pow_impl(const T v0, const T v1, real_type_tag)
function T (line 957) | inline T pow_impl(const T v0, const T v1, int_type_tag)
function T (line 963) | inline T logn_impl(const T v0, const T v1, real_type_tag)
function T (line 969) | inline T logn_impl(const T v0, const T v1, int_type_tag)
function T (line 975) | inline T log1p_impl(const T v, real_type_tag)
function T (line 991) | inline T log1p_impl(const T v, int_type_tag)
function T (line 1002) | inline T root_impl(const T v0, const T v1, real_type_tag)
function T (line 1016) | inline T root_impl(const T v0, const T v1, int_type_tag)
function T (line 1022) | inline T round_impl(const T v, real_type_tag)
function T (line 1028) | inline T roundn_impl(const T v0, const T v1, real_type_tag)
function T (line 1040) | inline T roundn_impl(const T v0, const T, int_type_tag)
function T (line 1046) | inline T hypot_impl(const T v0, const T v1, real_type_tag)
function T (line 1052) | inline T hypot_impl(const T v0, const T v1, int_type_tag)
function T (line 1058) | inline T atan2_impl(const T v0, const T v1, real_type_tag)
function T (line 1064) | inline T atan2_impl(const T, const T, int_type_tag)
function T (line 1070) | inline T shr_impl(const T v0, const T v1, real_type_tag)
function T (line 1076) | inline T shr_impl(const T v0, const T v1, int_type_tag)
function T (line 1082) | inline T shl_impl(const T v0, const T v1, real_type_tag)
function T (line 1088) | inline T shl_impl(const T v0, const T v1, int_type_tag)
function T (line 1094) | inline T sgn_impl(const T v, real_type_tag)
function T (line 1102) | inline T sgn_impl(const T v, int_type_tag)
function T (line 1110) | inline T and_impl(const T v0, const T v1, real_type_tag)
function T (line 1116) | inline T and_impl(const T v0, const T v1, int_type_tag)
function T (line 1122) | inline T nand_impl(const T v0, const T v1, real_type_tag)
function T (line 1128) | inline T nand_impl(const T v0, const T v1, int_type_tag)
function T (line 1134) | inline T or_impl(const T v0, const T v1, real_type_tag)
function T (line 1140) | inline T or_impl(const T v0, const T v1, int_type_tag)
function T (line 1146) | inline T nor_impl(const T v0, const T v1, real_type_tag)
function T (line 1152) | inline T nor_impl(const T v0, const T v1, int_type_tag)
function T (line 1158) | inline T xor_impl(const T v0, const T v1, real_type_tag)
function T (line 1164) | inline T xor_impl(const T v0, const T v1, int_type_tag)
function T (line 1170) | inline T xnor_impl(const T v0, const T v1, real_type_tag)
function T (line 1182) | inline T xnor_impl(const T v0, const T v1, int_type_tag)
function T (line 1204) | inline T erf_impl(T v, real_type_tag)
function T (line 1232) | inline T erf_impl(T v, int_type_tag)
function T (line 1248) | inline T erfc_impl(T v, real_type_tag)
function T (line 1258) | inline T erfc_impl(T v, int_type_tag)
function T (line 1264) | inline T ncdf_impl(T v, real_type_tag)
function T (line 1273) | inline T ncdf_impl(T v, int_type_tag)
function T (line 1279) | inline T sinc_impl(T v, real_type_tag)
function T (line 1288) | inline T sinc_impl(T v, int_type_tag)
function T (line 1293) | inline T acos_impl(const T v, real_type_tag) { return std::acos...
function T (line 1294) | inline T acosh_impl(const T v, real_type_tag) { return std::log(...
function T (line 1295) | inline T asin_impl(const T v, real_type_tag) { return std::asin...
function T (line 1296) | inline T asinh_impl(const T v, real_type_tag) { return std::log(...
function T (line 1297) | inline T atan_impl(const T v, real_type_tag) { return std::atan...
function T (line 1298) | inline T atanh_impl(const T v, real_type_tag) { return (std::log...
function T (line 1299) | inline T ceil_impl(const T v, real_type_tag) { return std::ceil...
function T (line 1300) | inline T cos_impl(const T v, real_type_tag) { return std::cos ...
function T (line 1301) | inline T cosh_impl(const T v, real_type_tag) { return std::cosh...
function T (line 1302) | inline T exp_impl(const T v, real_type_tag) { return std::exp ...
function T (line 1303) | inline T floor_impl(const T v, real_type_tag) { return std::floo...
function T (line 1304) | inline T log_impl(const T v, real_type_tag) { return std::log ...
function T (line 1305) | inline T log10_impl(const T v, real_type_tag) { return std::log1...
function T (line 1306) | inline T log2_impl(const T v, real_type_tag) { return std::log(...
function T (line 1307) | inline T neg_impl(const T v, real_type_tag) { return -v; ...
function T (line 1308) | inline T pos_impl(const T v, real_type_tag) { return +v; ...
function T (line 1309) | inline T sin_impl(const T v, real_type_tag) { return std::sin ...
function T (line 1310) | inline T sinh_impl(const T v, real_type_tag) { return std::sinh...
function T (line 1311) | inline T sqrt_impl(const T v, real_type_tag) { return std::sqrt...
function T (line 1312) | inline T tan_impl(const T v, real_type_tag) { return std::tan ...
function T (line 1313) | inline T tanh_impl(const T v, real_type_tag) { return std::tanh...
function T (line 1314) | inline T cot_impl(const T v, real_type_tag) { return T(1) / st...
function T (line 1315) | inline T sec_impl(const T v, real_type_tag) { return T(1) / st...
function T (line 1316) | inline T csc_impl(const T v, real_type_tag) { return T(1) / st...
function T (line 1317) | inline T r2d_impl(const T v, real_type_tag) { return (v * T(nu...
function T (line 1318) | inline T d2r_impl(const T v, real_type_tag) { return (v * T(nu...
function T (line 1319) | inline T d2g_impl(const T v, real_type_tag) { return (v * T(20...
function T (line 1320) | inline T g2d_impl(const T v, real_type_tag) { return (v * T(9....
function T (line 1321) | inline T notl_impl(const T v, real_type_tag) { return (std::not...
function T (line 1322) | inline T frac_impl(const T v, real_type_tag) { return (v - stat...
function T (line 1323) | inline T trunc_impl(const T v, real_type_tag) { return T(static_...
function T (line 1325) | inline T const_pi_impl(real_type_tag) { return T(numeric::consta...
function T (line 1326) | inline T const_e_impl (real_type_tag) { return T(numeric::consta...
function T (line 1328) | inline T abs_impl(const T v, int_type_tag) { return ((v >= T(0...
function T (line 1329) | inline T exp_impl(const T v, int_type_tag) { return std::exp ...
function T (line 1330) | inline T log_impl(const T v, int_type_tag) { return std::log ...
function T (line 1331) | inline T log10_impl(const T v, int_type_tag) { return std::log10...
function T (line 1332) | inline T log2_impl(const T v, int_type_tag) { return std::log(v...
function T (line 1333) | inline T neg_impl(const T v, int_type_tag) { return -v; ...
function T (line 1334) | inline T pos_impl(const T v, int_type_tag) { return +v; ...
function T (line 1335) | inline T ceil_impl(const T v, int_type_tag) { return v; ...
function T (line 1336) | inline T floor_impl(const T v, int_type_tag) { return v; ...
function T (line 1337) | inline T round_impl(const T v, int_type_tag) { return v; ...
function T (line 1338) | inline T notl_impl(const T v, int_type_tag) { return !v; ...
function T (line 1339) | inline T sqrt_impl(const T v, int_type_tag) { return std::sqrt ...
function T (line 1340) | inline T frac_impl(const T , int_type_tag) { return T(0); ...
function T (line 1341) | inline T trunc_impl(const T v, int_type_tag) { return v; ...
function T (line 1342) | inline T acos_impl(const T , int_type_tag) { return std::numer...
function T (line 1343) | inline T acosh_impl(const T , int_type_tag) { return std::numer...
function T (line 1344) | inline T asin_impl(const T , int_type_tag) { return std::numer...
function T (line 1345) | inline T asinh_impl(const T , int_type_tag) { return std::numer...
function T (line 1346) | inline T atan_impl(const T , int_type_tag) { return std::numer...
function T (line 1347) | inline T atanh_impl(const T , int_type_tag) { return std::numer...
function T (line 1348) | inline T cos_impl(const T , int_type_tag) { return std::numer...
function T (line 1349) | inline T cosh_impl(const T , int_type_tag) { return std::numer...
function T (line 1350) | inline T sin_impl(const T , int_type_tag) { return std::numer...
function T (line 1351) | inline T sinh_impl(const T , int_type_tag) { return std::numer...
function T (line 1352) | inline T tan_impl(const T , int_type_tag) { return std::numer...
function T (line 1353) | inline T tanh_impl(const T , int_type_tag) { return std::numer...
function T (line 1354) | inline T cot_impl(const T , int_type_tag) { return std::numer...
function T (line 1355) | inline T sec_impl(const T , int_type_tag) { return std::numer...
function T (line 1356) | inline T csc_impl(const T , int_type_tag) { return std::numer...
function is_integer_impl (line 1359) | inline bool is_integer_impl(const T& v, real_type_tag)
function is_integer_impl (line 1365) | inline bool is_integer_impl(const T&, int_type_tag)
type numeric_info (line 1372) | struct numeric_info { enum { length = 0, size = 32, bound_length =...
type numeric_info<int> (line 1374) | struct numeric_info<int> { enum { length = 10, size = 16, ...
type numeric_info<float> (line 1375) | struct numeric_info<float> { enum { min_exp = -38, max_exp ...
type numeric_info<double> (line 1376) | struct numeric_info<double> { enum { min_exp = -308, max_exp ...
type numeric_info<long double> (line 1377) | struct numeric_info<long double> { enum { min_exp = -308, max_exp ...
function to_int32 (line 1380) | inline int to_int32(const T v)
function to_int64 (line 1387) | inline long long int to_int64(const T v)
function is_nan (line 1394) | inline bool is_nan(const T v)
function T (line 1401) | inline T min(const T v0, const T v1)
function T (line 1408) | inline T max(const T v0, const T v1)
function T (line 1415) | inline T equal(const T v0, const T v1)
function T (line 1422) | inline T nequal(const T v0, const T v1)
function T (line 1429) | inline T modulus(const T v0, const T v1)
function T (line 1436) | inline T pow(const T v0, const T v1)
function T (line 1443) | inline T logn(const T v0, const T v1)
function T (line 1450) | inline T root(const T v0, const T v1)
function T (line 1457) | inline T roundn(const T v0, const T v1)
function T (line 1464) | inline T hypot(const T v0, const T v1)
function T (line 1471) | inline T atan2(const T v0, const T v1)
function T (line 1478) | inline T shr(const T v0, const T v1)
function T (line 1485) | inline T shl(const T v0, const T v1)
function T (line 1492) | inline T and_opr(const T v0, const T v1)
function T (line 1499) | inline T nand_opr(const T v0, const T v1)
function T (line 1506) | inline T or_opr(const T v0, const T v1)
function T (line 1513) | inline T nor_opr(const T v0, const T v1)
function T (line 1520) | inline T xor_opr(const T v0, const T v1)
function T (line 1527) | inline T xnor_opr(const T v0, const T v1)
function is_integer (line 1534) | inline bool is_integer(const T v)
type fast_exp (line 1541) | struct fast_exp
method T (line 1543) | static inline T result(T v)
type fast_exp<T,10> (line 1564) | struct fast_exp<T,10> { static inline T result(T v) { T v_5 = fast...
method T (line 1564) | static inline T result(T v) { T v_5 = fast_exp<T,5>::result(v); ...
type fast_exp<T, 9> (line 1565) | struct fast_exp<T, 9> { static inline T result(T v) { return fast_...
method T (line 1565) | static inline T result(T v) { return fast_exp<T,8>::result(v) * ...
type fast_exp<T, 8> (line 1566) | struct fast_exp<T, 8> { static inline T result(T v) { T v_4 = fast...
method T (line 1566) | static inline T result(T v) { T v_4 = fast_exp<T,4>::result(v); ...
type fast_exp<T, 7> (line 1567) | struct fast_exp<T, 7> { static inline T result(T v) { return fast_...
method T (line 1567) | static inline T result(T v) { return fast_exp<T,6>::result(v) * ...
type fast_exp<T, 6> (line 1568) | struct fast_exp<T, 6> { static inline T result(T v) { T v_3 = fast...
method T (line 1568) | static inline T result(T v) { T v_3 = fast_exp<T,3>::result(v); ...
type fast_exp<T, 5> (line 1569) | struct fast_exp<T, 5> { static inline T result(T v) { return fast_...
method T (line 1569) | static inline T result(T v) { return fast_exp<T,4>::result(v) * ...
type fast_exp<T, 4> (line 1570) | struct fast_exp<T, 4> { static inline T result(T v) { T v_2 = v * ...
method T (line 1570) | static inline T result(T v) { T v_2 = v * v; return v_2 * v_2; }
type fast_exp<T, 3> (line 1571) | struct fast_exp<T, 3> { static inline T result(T v) { return v * v...
method T (line 1571) | static inline T result(T v) { return v * v * v; }
type fast_exp<T, 2> (line 1572) | struct fast_exp<T, 2> { static inline T result(T v) { return v * v...
method T (line 1572) | static inline T result(T v) { return v * v; }
type fast_exp<T, 1> (line 1573) | struct fast_exp<T, 1> { static inline T result(T v) { return v; ...
method T (line 1573) | static inline T result(T v) { return v; }
type fast_exp<T, 0> (line 1574) | struct fast_exp<T, 0> { static inline T result(T ) { return T(1);...
method T (line 1574) | static inline T result(T ) { return T(1); }
function T (line 1628) | inline T compute_pow10(T d, const int exponent)
function string_to_type_converter_impl_ref (line 1690) | inline bool string_to_type_converter_impl_ref(Iterator& itr, const I...
function parse_nan (line 1763) | static inline bool parse_nan(Iterator& itr, const Iterator end, T& t)
function parse_inf (line 1796) | static inline bool parse_inf(Iterator& itr, const Iterator end, T& t, ...
function string_to_real (line 1830) | inline bool string_to_real(Iterator& itr_external, const Iterator end,...
function string_to_real (line 1991) | inline bool string_to_real(const std::string& s, T& t)
type functor_t (line 2002) | struct functor_t
class timer (line 36402) | class timer
method timer (line 36407) | timer()
method start (line 36413) | inline void start()
method stop (line 36419) | inline void stop()
method time (line 36425) | inline double time() const
method timer (line 36432) | timer()
method start (line 36441) | inline void start()
method stop (line 36447) | inline void stop()
method usec_time (line 36453) | inline unsigned long long int usec_time() const
method time (line 36469) | inline double time() const
method in_use (line 36476) | inline bool in_use() const
type timeval (line 36490) | struct timeval
type timeval (line 36491) | struct timeval
type rtl (line 36500) | namespace rtl { namespace io { namespace details
type io (line 36500) | namespace io { namespace details
type details (line 36500) | namespace details
function print_type (line 36503) | inline void print_type(const std::string& fmt,
type print_impl (line 36511) | struct print_impl
method process (line 36520) | static void process(const std::string& scalar_format, paramete...
method print (line 36542) | static inline void print(const std::string& scalar_format, con...
method print (line 36547) | static inline void print(const std::string& scalar_format, con...
method print (line 36558) | static inline void print(const string_t& s)
type print (line 36567) | struct print : public exprtk::igeneric_function<T>
method print (line 36573) | print(const std::string& scalar_format = "%10.5f")
method T (line 36579) | inline T operator() (parameter_list_t parameters)
type println (line 36589) | struct println : public exprtk::igeneric_function<T>
method println (line 36595) | println(const std::string& scalar_format = "%10.5f")
method T (line 36601) | inline T operator() (parameter_list_t parameters)
type package (line 36612) | struct package
method register_package (line 36617) | bool register_package(exprtk::symbol_table<T>& symtab)
type file (line 36645) | namespace file { namespace details
type details (line 36645) | namespace details
type file_mode (line 36647) | enum file_mode
type file_descriptor (line 36655) | struct file_descriptor
method file_descriptor (line 36657) | file_descriptor(const std::string& fname, const std::string&...
method open (line 36667) | bool open()
method close (line 36722) | void close(Ptr& p)
method close (line 36730) | bool close()
method write (line 36750) | bool write(const View& view, const std::size_t amount, const...
method read (line 36769) | bool read(View& view, const std::size_t amount, const std::s...
method getline (line 36787) | bool getline(std::string& s)
method eof (line 36797) | bool eof()
method file_mode (line 36808) | file_mode get_file_mode(const std::string& access)
function file_descriptor (line 36840) | file_descriptor* make_handle(T v)
method file_descriptor (line 36657) | file_descriptor(const std::string& fname, const std::string&...
method open (line 36667) | bool open()
method close (line 36722) | void close(Ptr& p)
method close (line 36730) | bool close()
method write (line 36750) | bool write(const View& view, const std::size_t amount, const...
method read (line 36769) | bool read(View& view, const std::size_t amount, const std::s...
method getline (line 36787) | bool getline(std::string& s)
method eof (line 36797) | bool eof()
method file_mode (line 36808) | file_mode get_file_mode(const std::string& access)
function perform_check (line 36851) | void perform_check()
class open (line 36869) | class open : public exprtk::igeneric_function<T>
method open (line 36880) | open()
method T (line 36884) | inline T operator() (const std::size_t& ps_index, parameter_li...
type close (line 36921) | struct close : public exprtk::ifunction<T>
method close (line 36925) | close()
method T (line 36929) | inline T operator() (const T& v)
class write (line 36943) | class write : public exprtk::igeneric_function<T>
method write (line 36956) | write()
method T (line 36960) | inline T operator() (const std::size_t& ps_index, parameter_li...
class read (line 37000) | class read : public exprtk::igeneric_function<T>
method read (line 37013) | read()
method T (line 37017) | inline T operator() (const std::size_t& ps_index, parameter_li...
class getline (line 37057) | class getline : public exprtk::igeneric_function<T>
method getline (line 37069) | getline()
method T (line 37073) | inline T operator() (std::string& result,
type eof (line 37082) | struct eof : public exprtk::ifunction<T>
method eof (line 37086) | eof()
method T (line 37090) | inline T operator() (const T& v)
type package (line 37099) | struct package
method register_package (line 37108) | bool register_package(exprtk::symbol_table<T>& symtab)
type io (line 36645) | namespace io { namespace file { namespace details
type details (line 36500) | namespace details
function print_type (line 36503) | inline void print_type(const std::string& fmt,
type print_impl (line 36511) | struct print_impl
method process (line 36520) | static void process(const std::string& scalar_format, paramete...
method print (line 36542) | static inline void print(const std::string& scalar_format, con...
method print (line 36547) | static inline void print(const std::string& scalar_format, con...
method print (line 36558) | static inline void print(const string_t& s)
type print (line 36567) | struct print : public exprtk::igeneric_function<T>
method print (line 36573) | print(const std::string& scalar_format = "%10.5f")
method T (line 36579) | inline T operator() (parameter_list_t parameters)
type println (line 36589) | struct println : public exprtk::igeneric_function<T>
method println (line 36595) | println(const std::string& scalar_format = "%10.5f")
method T (line 36601) | inline T operator() (parameter_list_t parameters)
type package (line 36612) | struct package
method register_package (line 36617) | bool register_package(exprtk::symbol_table<T>& symtab)
type file (line 36645) | namespace file { namespace details
type details (line 36645) | namespace details
type file_mode (line 36647) | enum file_mode
type file_descriptor (line 36655) | struct file_descriptor
method file_descriptor (line 36657) | file_descriptor(const std::string& fname, const std::string&...
method open (line 36667) | bool open()
method close (line 36722) | void close(Ptr& p)
method close (line 36730) | bool close()
method write (line 36750) | bool write(const View& view, const std::size_t amount, const...
method read (line 36769) | bool read(View& view, const std::size_t amount, const std::s...
method getline (line 36787) | bool getline(std::string& s)
method eof (line 36797) | bool eof()
method file_mode (line 36808) | file_mode get_file_mode(const std::string& access)
function file_descriptor (line 36840) | file_descriptor* make_handle(T v)
method file_descriptor (line 36657) | file_descriptor(const std::string& fname, const std::string&...
method open (line 36667) | bool open()
method close (line 36722) | void close(Ptr& p)
method close (line 36730) | bool close()
method write (line 36750) | bool write(const View& view, const std::size_t amount, const...
method read (line 36769) | bool read(View& view, const std::size_t amount, const std::s...
method getline (line 36787) | bool getline(std::string& s)
method eof (line 36797) | bool eof()
method file_mode (line 36808) | file_mode get_file_mode(const std::string& access)
function perform_check (line 36851) | void perform_check()
class open (line 36869) | class open : public exprtk::igeneric_function<T>
method open (line 36880) | open()
method T (line 36884) | inline T operator() (const std::size_t& ps_index, parameter_li...
type close (line 36921) | struct close : public exprtk::ifunction<T>
method close (line 36925) | close()
method T (line 36929) | inline T operator() (const T& v)
class write (line 36943) | class write : public exprtk::igeneric_function<T>
method write (line 36956) | write()
method T (line 36960) | inline T operator() (const std::size_t& ps_index, parameter_li...
class read (line 37000) | class read : public exprtk::igeneric_function<T>
method read (line 37013) | read()
method T (line 37017) | inline T operator() (const std::size_t& ps_index, parameter_li...
class getline (line 37057) | class getline : public exprtk::igeneric_function<T>
method getline (line 37069) | getline()
method T (line 37073) | inline T operator() (std::string& result,
type eof (line 37082) | struct eof : public exprtk::ifunction<T>
method eof (line 37086) | eof()
method T (line 37090) | inline T operator() (const T& v)
type package (line 37099) | struct package
method register_package (line 37108) | bool register_package(exprtk::symbol_table<T>& symtab)
type vecops (line 37140) | namespace vecops {
type helper (line 37142) | namespace helper
function invalid_range (line 37145) | inline bool invalid_range(const Vector& v, const std::size_t r0,...
type load_vector_range (line 37158) | struct load_vector_range
method process (line 37166) | static inline bool process(parameter_list_t& parameters,
type details (line 37189) | namespace details
function kahan_sum (line 37192) | inline void kahan_sum(T& sum, T& error, T v)
class all_true (line 37203) | class all_true : public exprtk::igeneric_function<T>
method all_true (line 37214) | all_true()
method T (line 37223) | inline T operator() (const std::size_t& ps_index, parameter_list...
class all_false (line 37249) | class all_false : public exprtk::igeneric_function<T>
method all_false (line 37260) | all_false()
method T (line 37269) | inline T operator() (const std::size_t& ps_index, parameter_list...
class any_true (line 37295) | class any_true : public exprtk::igeneric_function<T>
method any_true (line 37306) | any_true()
method T (line 37315) | inline T operator() (const std::size_t& ps_index, parameter_list...
class any_false (line 37341) | class any_false : public exprtk::igeneric_function<T>
method any_false (line 37352) | any_false()
method T (line 37361) | inline T operator() (const std::size_t& ps_index, parameter_list...
class count (line 37387) | class count : public exprtk::igeneric_function<T>
method count (line 37398) | count()
method T (line 37407) | inline T operator() (const std::size_t& ps_index, parameter_list...
class copy (line 37432) | class copy : public exprtk::igeneric_function<T>
method copy (line 37444) | copy()
method T (line 37453) | inline T operator() (const std::size_t& ps_index, parameter_list...
class rol (line 37482) | class rol : public exprtk::igeneric_function<T>
method rol (line 37494) | rol()
method T (line 37503) | inline T operator() (const std::size_t& ps_index, parameter_list...
class ror (line 37530) | class ror : public exprtk::igeneric_function<T>
method ror (line 37542) | ror()
method T (line 37551) | inline T operator() (const std::size_t& ps_index, parameter_list...
class shift_left (line 37578) | class shift_left : public exprtk::igeneric_function<T>
method shift_left (line 37590) | shift_left()
method T (line 37599) | inline T operator() (const std::size_t& ps_index, parameter_list...
class shift_right (line 37633) | class shift_right : public exprtk::igeneric_function<T>
method shift_right (line 37645) | shift_right()
method T (line 37654) | inline T operator() (const std::size_t& ps_index, parameter_list...
class sort (line 37690) | class sort : public exprtk::igeneric_function<T>
method sort (line 37702) | sort()
method T (line 37713) | inline T operator() (const std::size_t& ps_index, parameter_list...
class nthelement (line 37747) | class nthelement : public exprtk::igeneric_function<T>
method nthelement (line 37759) | nthelement()
method T (line 37768) | inline T operator() (const std::size_t& ps_index, parameter_list...
class iota (line 37789) | class iota : public exprtk::igeneric_function<T>
method iota (line 37801) | iota()
method T (line 37812) | inline T operator() (const std::size_t& ps_index, parameter_list...
class sumk (line 37841) | class sumk : public exprtk::igeneric_function<T>
method sumk (line 37852) | sumk()
method T (line 37861) | inline T operator() (const std::size_t& ps_index, parameter_list...
class axpy (line 37884) | class axpy : public exprtk::igeneric_function<T>
method axpy (line 37896) | axpy()
method T (line 37906) | inline T operator() (const std::size_t& ps_index, parameter_list...
class axpby (line 37931) | class axpby : public exprtk::igeneric_function<T>
method axpby (line 37943) | axpby()
method T (line 37953) | inline T operator() (const std::size_t& ps_index, parameter_list...
class axpyz (line 37979) | class axpyz : public exprtk::igeneric_function<T>
method axpyz (line 37991) | axpyz()
method T (line 38001) | inline T operator() (const std::size_t& ps_index, parameter_list...
class axpbyz (line 38029) | class axpbyz : public exprtk::igeneric_function<T>
method axpbyz (line 38041) | axpbyz()
method T (line 38051) | inline T operator() (const std::size_t& ps_index, parameter_list...
class axpbz (line 38080) | class axpbz : public exprtk::igeneric_function<T>
method axpbz (line 38092) | axpbz()
method T (line 38102) | inline T operator() (const std::size_t& ps_index, parameter_list...
class dot (line 38128) | class dot : public exprtk::igeneric_function<T>
method dot (line 38140) | dot()
method T (line 38149) | inline T operator() (const std::size_t& ps_index, parameter_list...
class dotk (line 38174) | class dotk : public exprtk::igeneric_function<T>
method dotk (line 38186) | dotk()
method T (line 38195) | inline T operator() (const std::size_t& ps_index, parameter_list...
type package (line 38221) | struct package
method register_package (line 38245) | bool register_package(exprtk::symbol_table<T>& symtab)
type rtl (line 36645) | namespace rtl { namespace io { namespace file { namespace details
type io (line 36500) | namespace io { namespace details
type details (line 36500) | namespace details
function print_type (line 36503) | inline void print_type(const std::string& fmt,
type print_impl (line 36511) | struct print_impl
method process (line 36520) | static void process(const std::string& scalar_format, paramete...
method print (line 36542) | static inline void print(const std::string& scalar_format, con...
method print (line 36547) | static inline void print(const std::string& scalar_format, con...
method print (line 36558) | static inline void print(const string_t& s)
type print (line 36567) | struct print : public exprtk::igeneric_function<T>
method print (line 36573) | print(const std::string& scalar_format = "%10.5f")
method T (line 36579) | inline T operator() (parameter_list_t parameters)
type println (line 36589) | struct println : public exprtk::igeneric_function<T>
method println (line 36595) | println(const std::string& scalar_format = "%10.5f")
method T (line 36601) | inline T operator() (parameter_list_t parameters)
type package (line 36612) | struct package
method register_package (line 36617) | bool register_package(exprtk::symbol_table<T>& symtab)
type file (line 36645) | namespace file { namespace details
type details (line 36645) | namespace details
type file_mode (line 36647) | enum file_mode
type file_descriptor (line 36655) | struct file_descriptor
method file_descriptor (line 36657) | file_descriptor(const std::string& fname, const std::string&...
method open (line 36667) | bool open()
method close (line 36722) | void close(Ptr& p)
method close (line 36730) | bool close()
method write (line 36750) | bool write(const View& view, const std::size_t amount, const...
method read (line 36769) | bool read(View& view, const std::size_t amount, const std::s...
method getline (line 36787) | bool getline(std::string& s)
method eof (line 36797) | bool eof()
method file_mode (line 36808) | file_mode get_file_mode(const std::string& access)
function file_descriptor (line 36840) | file_descriptor* make_handle(T v)
method file_descriptor (line 36657) | file_descriptor(const std::string& fname, const std::string&...
method open (line 36667) | bool open()
method close (line 36722) | void close(Ptr& p)
method close (line 36730) | bool close()
method write (line 36750) | bool write(const View& view, const std::size_t amount, const...
method read (line 36769) | bool read(View& view, const std::size_t amount, const std::s...
method getline (line 36787) | bool getline(std::string& s)
method eof (line 36797) | bool eof()
method file_mode (line 36808) | file_mode get_file_mode(const std::string& access)
function perform_check (line 36851) | void perform_check()
class open (line 36869) | class open : public exprtk::igeneric_function<T>
method open (line 36880) | open()
method T (line 36884) | inline T operator() (const std::size_t& ps_index, parameter_li...
type close (line 36921) | struct close : public exprtk::ifunction<T>
method close (line 36925) | close()
method T (line 36929) | inline T operator() (const T& v)
class write (line 36943) | class write : public exprtk::igeneric_function<T>
method write (line 36956) | write()
method T (line 36960) | inline T operator() (const std::size_t& ps_index, parameter_li...
class read (line 37000) | class read : public exprtk::igeneric_function<T>
method read (line 37013) | read()
method T (line 37017) | inline T operator() (const std::size_t& ps_index, parameter_li...
class getline (line 37057) | class getline : public exprtk::igeneric_function<T>
method getline (line 37069) | getline()
method T (line 37073) | inline T operator() (std::string& result,
type eof (line 37082) | struct eof : public exprtk::ifunction<T>
method eof (line 37086) | eof()
method T (line 37090) | inline T operator() (const T& v)
type package (line 37099) | struct package
method register_package (line 37108) | bool register_package(exprtk::symbol_table<T>& symtab)
type io (line 36645) | namespace io { namespace file { namespace details
type details (line 36500) | namespace details
function print_type (line 36503) | inline void print_type(const std::string& fmt,
type print_impl (line 36511) | struct print_impl
method process (line 36520) | static void process(const std::string& scalar_format, paramete...
method print (line 36542) | static inline void print(const std::string& scalar_format, con...
method print (line 36547) | static inline void print(const std::string& scalar_format, con...
method print (line 36558) | static inline void print(const string_t& s)
type print (line 36567) | struct print : public exprtk::igeneric_function<T>
method print (line 36573) | print(const std::string& scalar_format = "%10.5f")
method T (line 36579) | inline T operator() (parameter_list_t parameters)
type println (line 36589) | struct println : public exprtk::igeneric_function<T>
method println (line 36595) | println(const std::string& scalar_format = "%10.5f")
method T (line 36601) | inline T operator() (parameter_list_t parameters)
type package (line 36612) | struct package
method register_package (line 36617) | bool register_package(exprtk::symbol_table<T>& symtab)
type file (line 36645) | namespace file { namespace details
type details (line 36645) | namespace details
type file_mode (line 36647) | enum file_mode
type file_descriptor (line 36655) | struct file_descriptor
method file_descriptor (line 36657) | file_descriptor(const std::string& fname, const std::string&...
method open (line 36667) | bool open()
method close (line 36722) | void close(Ptr& p)
method close (line 36730) | bool close()
method write (line 36750) | bool write(const View& view, const std::size_t amount, const...
method read (line 36769) | bool read(View& view, const std::size_t amount, const std::s...
method getline (line 36787) | bool getline(std::string& s)
method eof (line 36797) | bool eof()
method file_mode (line 36808) | file_mode get_file_mode(const std::string& access)
function file_descriptor (line 36840) | file_descriptor* make_handle(T v)
method file_descriptor (line 36657) | file_descriptor(const std::string& fname, const std::string&...
method open (line 36667) | bool open()
method close (line 36722) | void close(Ptr& p)
method close (line 36730) | bool close()
method write (line 36750) | bool write(const View& view, const std::size_t amount, const...
method read (line 36769) | bool read(View& view, const std::size_t amount, const std::s...
method getline (line 36787) | bool getline(std::string& s)
method eof (line 36797) | bool eof()
method file_mode (line 36808) | file_mode get_file_mode(const std::string& access)
function perform_check (line 36851) | void perform_check()
class open (line 36869) | class open : public exprtk::igeneric_function<T>
method open (line 36880) | open()
method T (line 36884) | inline T operator() (const std::size_t& ps_index, parameter_li...
type close (line 36921) | struct close : public exprtk::ifunction<T>
method close (line 36925) | close()
method T (line 36929) | inline T operator() (const T& v)
class write (line 36943) | class write : public exprtk::igeneric_function<T>
method write (line 36956) | write()
method T (line 36960) | inline T operator() (const std::size_t& ps_index, parameter_li...
class read (line 37000) | class read : public exprtk::igeneric_function<T>
method read (line 37013) | read()
method T (line 37017) | inline T operator() (const std::size_t& ps_index, parameter_li...
class getline (line 37057) | class getline : public exprtk::igeneric_function<T>
method getline (line 37069) | getline()
method T (line 37073) | inline T operator() (std::string& result,
type eof (line 37082) | struct eof : public exprtk::ifunction<T>
method eof (line 37086) | eof()
method T (line 37090) | inline T operator() (const T& v)
type package (line 37099) | struct package
method register_package (line 37108) | bool register_package(exprtk::symbol_table<T>& symtab)
type vecops (line 37140) | namespace vecops {
type helper (line 37142) | namespace helper
function invalid_range (line 37145) | inline bool invalid_range(const Vector& v, const std::size_t r0,...
type load_vector_range (line 37158) | struct load_vector_range
method process (line 37166) | static inline bool process(parameter_list_t& parameters,
type details (line 37189) | namespace details
function kahan_sum (line 37192) | inline void kahan_sum(T& sum, T& error, T v)
class all_true (line 37203) | class all_true : public exprtk::igeneric_function<T>
method all_true (line 37214) | all_true()
method T (line 37223) | inline T operator() (const std::size_t& ps_index, parameter_list...
class all_false (line 37249) | class all_false : public exprtk::igeneric_function<T>
method all_false (line 37260) | all_false()
method T (line 37269) | inline T operator() (const std::size_t& ps_index, parameter_list...
class any_true (line 37295) | class any_true : public exprtk::igeneric_function<T>
method any_true (line 37306) | any_true()
method T (line 37315) | inline T operator() (const std::size_t& ps_index, parameter_list...
class any_false (line 37341) | class any_false : public exprtk::igeneric_function<T>
method any_false (line 37352) | any_false()
method T (line 37361) | inline T operator() (const std::size_t& ps_index, parameter_list...
class count (line 37387) | class count : public exprtk::igeneric_function<T>
method count (line 37398) | count()
method T (line 37407) | inline T operator() (const std::size_t& ps_index, parameter_list...
class copy (line 37432) | class copy : public exprtk::igeneric_function<T>
method copy (line 37444) | copy()
method T (line 37453) | inline T operator() (const std::size_t& ps_index, parameter_list...
class rol (line 37482) | class rol : public exprtk::igeneric_function<T>
method rol (line 37494) | rol()
method T (line 37503) | inline T operator() (const std::size_t& ps_index, parameter_list...
class ror (line 37530) | class ror : public exprtk::igeneric_function<T>
method ror (line 37542) | ror()
method T (line 37551) | inline T operator() (const std::size_t& ps_index, parameter_list...
class shift_left (line 37578) | class shift_left : public exprtk::igeneric_function<T>
method shift_left (line 37590) | shift_left()
method T (line 37599) | inline T operator() (const std::size_t& ps_index, parameter_list...
class shift_right (line 37633) | class shift_right : public exprtk::igeneric_function<T>
method shift_right (line 37645) | shift_right()
method T (line 37654) | inline T operator() (const std::size_t& ps_index, parameter_list...
class sort (line 37690) | class sort : public exprtk::igeneric_function<T>
method sort (line 37702) | sort()
method T (line 37713) | inline T operator() (const std::size_t& ps_index, parameter_list...
class nthelement (line 37747) | class nthelement : public exprtk::igeneric_function<T>
method nthelement (line 37759) | nthelement()
method T (line 37768) | inline T operator() (const std::size_t& ps_index, parameter_list...
class iota (line 37789) | class iota : public exprtk::igeneric_function<T>
method iota (line 37801) | iota()
method T (line 37812) | inline T operator() (const std::size_t& ps_index, parameter_list...
class sumk (line 37841) | class sumk : public exprtk::igeneric_function<T>
method sumk (line 37852) | sumk()
method T (line 37861) | inline T operator() (const std::size_t& ps_index, parameter_list...
class axpy (line 37884) | class axpy : public exprtk::igeneric_function<T>
method axpy (line 37896) | axpy()
method T (line 37906) | inline T operator() (const std::size_t& ps_index, parameter_list...
class axpby (line 37931) | class axpby : public exprtk::igeneric_function<T>
method axpby (line 37943) | axpby()
method T (line 37953) | inline T operator() (const std::size_t& ps_index, parameter_list...
class axpyz (line 37979) | class axpyz : public exprtk::igeneric_function<T>
method axpyz (line 37991) | axpyz()
method T (line 38001) | inline T operator() (const std::size_t& ps_index, parameter_list...
class axpbyz (line 38029) | class axpbyz : public exprtk::igeneric_function<T>
method axpbyz (line 38041) | axpbyz()
method T (line 38051) | inline T operator() (const std::size_t& ps_index, parameter_list...
class axpbz (line 38080) | class axpbz : public exprtk::igeneric_function<T>
method axpbz (line 38092) | axpbz()
method T (line 38102) | inline T operator() (const std::size_t& ps_index, parameter_list...
class dot (line 38128) | class dot : public exprtk::igeneric_function<T>
method dot (line 38140) | dot()
method T (line 38149) | inline T operator() (const std::size_t& ps_index, parameter_list...
class dotk (line 38174) | class dotk : public exprtk::igeneric_function<T>
method dotk (line 38186) | dotk()
method T (line 38195) | inline T operator() (const std::size_t& ps_index, parameter_list...
type package (line 38221) | struct package
method register_package (line 38245) | bool register_package(exprtk::symbol_table<T>& symtab)
type rtl (line 37140) | namespace rtl { namespace vecops {
type io (line 36500) | namespace io { namespace details
type details (line 36500) | namespace details
function print_type (line 36503) | inline void print_type(const std::string& fmt,
type print_impl (line 36511) | struct print_impl
method process (line 36520) | static void process(const std::string& scalar_format, paramete...
method print (line 36542) | static inline void print(const std::string& scalar_format, con...
method print (line 36547) | static inline void print(const std::string& scalar_format, con...
method print (line 36558) | static inline void print(const string_t& s)
type print (line 36567) | struct print : public exprtk::igeneric_function<T>
method print (line 36573) | print(const std::string& scalar_format = "%10.5f")
method T (line 36579) | inline T operator() (parameter_list_t parameters)
type println (line 36589) | struct println : public exprtk::igeneric_function<T>
method println (line 36595) | println(const std::string& scalar_format = "%10.5f")
method T (line 36601) | inline T operator() (parameter_list_t parameters)
type package (line 36612) | struct package
method register_package (line 36617) | bool register_package(exprtk::symbol_table<T>& symtab)
type file (line 36645) | namespace file { namespace details
type details (line 36645) | namespace details
type file_mode (line 36647) | enum file_mode
type file_descriptor (line 36655) | struct file_descriptor
method file_descriptor (line 36657) | file_descriptor(const std::string& fname, const std::string&...
method open (line 36667) | bool open()
method close (line 36722) | void close(Ptr& p)
method close (line 36730) | bool close()
method write (line 36750) | bool write(const View& view, const std::size_t amount, const...
method read (line 36769) | bool read(View& view, const std::size_t amount, const std::s...
method getline (line 36787) | bool getline(std::string& s)
method eof (line 36797) | bool eof()
method file_mode (line 36808) | file_mode get_file_mode(const std::string& access)
function file_descriptor (line 36840) | file_descriptor* make_handle(T v)
method file_descriptor (line 36657) | file_descriptor(const std::string& fname, const std::string&...
method open (line 36667) | bool open()
method close (line 36722) | void close(Ptr& p)
method close (line 36730) | bool close()
method write (line 36750) | bool write(const View& view, const std::size_t amount, const...
method read (line 36769) | bool read(View& view, const std::size_t amount, const std::s...
method getline (line 36787) | bool getline(std::string& s)
method eof (line 36797) | bool eof()
method file_mode (line 36808) | file_mode get_file_mode(const std::string& access)
function perform_check (line 36851) | void perform_check()
class open (line 36869) | class open : public exprtk::igeneric_function<T>
method open (line 36880) | open()
method T (line 36884) | inline T operator() (const std::size_t& ps_index, parameter_li...
type close (line 36921) | struct close : public exprtk::ifunction<T>
method close (line 36925) | close()
method T (line 36929) | inline T operator() (const T& v)
class write (line 36943) | class write : public exprtk::igeneric_function<T>
method write (line 36956) | write()
method T (line 36960) | inline T operator() (const std::size_t& ps_index, parameter_li...
class read (line 37000) | class read : public exprtk::igeneric_function<T>
method read (line 37013) | read()
method T (line 37017) | inline T operator() (const std::size_t& ps_index, parameter_li...
class getline (line 37057) | class getline : public exprtk::igeneric_function<T>
method getline (line 37069) | getline()
method T (line 37073) | inline T operator() (std::string& result,
type eof (line 37082) | struct eof : public exprtk::ifunction<T>
method eof (line 37086) | eof()
method T (line 37090) | inline T operator() (const T& v)
type package (line 37099) | struct package
method register_package (line 37108) | bool register_package(exprtk::symbol_table<T>& symtab)
type io (line 36645) | namespace io { namespace file { namespace details
type details (line 36500) | namespace details
function print_type (line 36503) | inline void print_type(const std::string& fmt,
type print_impl (line 36511) | struct print_impl
method process (line 36520) | static void process(const std::string& scalar_format, paramete...
method print (line 36542) | static inline void print(const std::string& scalar_format, con...
method print (line 36547) | static inline void print(const std::string& scalar_format, con...
method print (line 36558) | static inline void print(const string_t& s)
type print (line 36567) | struct print : public exprtk::igeneric_function<T>
method print (line 36573) | print(const std::string& scalar_format = "%10.5f")
method T (line 36579) | inline T operator() (parameter_list_t parameters)
type println (line 36589) | struct println : public exprtk::igeneric_function<T>
method println (line 36595) | println(const std::string& scalar_format = "%10.5f")
method T (line 36601) | inline T operator() (parameter_list_t parameters)
type package (line 36612) | struct package
method register_package (line 36617) | bool register_package(exprtk::symbol_table<T>& symtab)
type file (line 36645) | namespace file { namespace details
type details (line 36645) | namespace details
type file_mode (line 36647) | enum file_mode
type file_descriptor (line 36655) | struct file_descriptor
method file_descriptor (line 36657) | file_descriptor(const std::string& fname, const std::string&...
method open (line 36667) | bool open()
method close (line 36722) | void close(Ptr& p)
method close (line 36730) | bool close()
method write (line 36750) | bool write(const View& view, const std::size_t amount, const...
method read (line 36769) | bool read(View& view, const std::size_t amount, const std::s...
method getline (line 36787) | bool getline(std::string& s)
method eof (line 36797) | bool eof()
method file_mode (line 36808) | file_mode get_file_mode(const std::string& access)
function file_descriptor (line 36840) | file_descriptor* make_handle(T v)
method file_descriptor (line 36657) | file_descriptor(const std::string& fname, const std::string&...
method open (line 36667) | bool open()
method close (line 36722) | void close(Ptr& p)
method close (line 36730) | bool close()
method write (line 36750) | bool write(const View& view, const std::size_t amount, const...
method read (line 36769) | bool read(View& view, const std::size_t amount, const std::s...
method getline (line 36787) | bool getline(std::string& s)
method eof (line 36797) | bool eof()
method file_mode (line 36808) | file_mode get_file_mode(const std::string& access)
function perform_check (line 36851) | void perform_check()
class open (line 36869) | class open : public exprtk::igeneric_function<T>
method open (line 36880) | open()
method T (line 36884) | inline T operator() (const std::size_t& ps_index, parameter_li...
type close (line 36921) | struct close : public exprtk::ifunction<T>
method close (line 36925) | close()
method T (line 36929) | inline T operator() (const T& v)
class write (line 36943) | class write : public exprtk::igeneric_function<T>
method write (line 36956) | write()
method T (line 36960) | inline T operator() (const std::size_t& ps_index, parameter_li...
class read (line 37000) | class read : public exprtk::igeneric_function<T>
method read (line 37013) | read()
method T (line 37017) | inline T operator() (const std::size_t& ps_index, parameter_li...
class getline (line 37057) | class getline : public exprtk::igeneric_function<T>
method getline (line 37069) | getline()
method T (line 37073) | inline T operator() (std::string& result,
type eof (line 37082) | struct eof : public exprtk::ifunction<T>
method eof (line 37086) | eof()
method T (line 37090) | inline T operator() (const T& v)
type package (line 37099) | struct package
method register_package (line 37108) | bool register_package(exprtk::symbol_table<T>& symtab)
type vecops (line 37140) | namespace vecops {
type helper (line 37142) | namespace helper
function invalid_range (line 37145) | inline bool invalid_range(const Vector& v, const std::size_t r0,...
type load_vector_range (line 37158) | struct load_vector_range
method process (line 37166) | static inline bool process(parameter_list_t& parameters,
type details (line 37189) | namespace details
function kahan_sum (line 37192) | inline void kahan_sum(T& sum, T& error, T v)
class all_true (line 37203) | class all_true : public exprtk::igeneric_function<T>
method all_true (line 37214) | all_true()
method T (line 37223) | inline T operator() (const std::size_t& ps_index, parameter_list...
class all_false (line 37249) | class all_false : public exprtk::igeneric_function<T>
method all_false (line 37260) | all_false()
method T (line 37269) | inline T operator() (const std::size_t& ps_index, parameter_list...
class any_true (line 37295) | class any_true : public exprtk::igeneric_function<T>
method any_true (line 37306) | any_true()
method T (line 37315) | inline T operator() (const std::size_t& ps_index, parameter_list...
class any_false (line 37341) | class any_false : public exprtk::igeneric_function<T>
method any_false (line 37352) | any_false()
method T (line 37361) | inline T operator() (const std::size_t& ps_index, parameter_list...
class count (line 37387) | class count : public exprtk::igeneric_function<T>
method count (line 37398) | count()
method T (line 37407) | inline T operator() (const std::size_t& ps_index, parameter_list...
class copy (line 37432) | class copy : public exprtk::igeneric_function<T>
method copy (line 37444) | copy()
method T (line 37453) | inline T operator() (const std::size_t& ps_index, parameter_list...
class rol (line 37482) | class rol : public exprtk::igeneric_function<T>
method rol (line 37494) | rol()
method T (line 37503) | inline T operator() (const std::size_t& ps_index, parameter_list...
class ror (line 37530) | class ror : public exprtk::igeneric_function<T>
method ror (line 37542) | ror()
method T (line 37551) | inline T operator() (const std::size_t& ps_index, parameter_list...
class shift_left (line 37578) | class shift_left : public exprtk::igeneric_function<T>
method shift_left (line 37590) | shift_left()
method T (line 37599) | inline T operator() (const std::size_t& ps_index, parameter_list...
class shift_right (line 37633) | class shift_right : public exprtk::igeneric_function<T>
method shift_right (line 37645) | shift_right()
method T (line 37654) | inline T operator() (const std::size_t& ps_index, parameter_list...
class sort (line 37690) | class sort : public exprtk::igeneric_function<T>
method sort (line 37702) | sort()
method T (line 37713) | inline T operator() (const std::size_t& ps_index, parameter_list...
class nthelement (line 37747) | class nthelement : public exprtk::igeneric_function<T>
method nthelement (line 37759) | nthelement()
method T (line 37768) | inline T operator() (const std::size_t& ps_index, parameter_list...
class iota (line 37789) | class iota : public exprtk::igeneric_function<T>
method iota (line 37801) | iota()
method T (line 37812) | inline T operator() (const std::size_t& ps_index, parameter_list...
class sumk (line 37841) | class sumk : public exprtk::igeneric_function<T>
method sumk (line 37852) | sumk()
method T (line 37861) | inline T operator() (const std::size_t& ps_index, parameter_list...
class axpy (line 37884) | class axpy : public exprtk::igeneric_function<T>
method axpy (line 37896) | axpy()
method T (line 37906) | inline T operator() (const std::size_t& ps_index, parameter_list...
class axpby (line 37931) | class axpby : public exprtk::igeneric_function<T>
method axpby (line 37943) | axpby()
method T (line 37953) | inline T operator() (const std::size_t& ps_index, parameter_list...
class axpyz (line 37979) | class axpyz : public exprtk::igeneric_function<T>
method axpyz (line 37991) | axpyz()
method T (line 38001) | inline T operator() (const std::size_t& ps_index, parameter_list...
class axpbyz (line 38029) | class axpbyz : public exprtk::igeneric_function<T>
method axpbyz (line 38041) | axpbyz()
method T (line 38051) | inline T operator() (const std::size_t& ps_index, parameter_list...
class axpbz (line 38080) | class axpbz : public exprtk::igeneric_function<T>
method axpbz (line 38092) | axpbz()
method T (line 38102) | inline T operator() (const std::size_t& ps_index, parameter_list...
class dot (line 38128) | class dot : public exprtk::igeneric_function<T>
method dot (line 38140) | dot()
method T (line 38149) | inline T operator() (const std::size_t& ps_index, parameter_list...
class dotk (line 38174) | class dotk : public exprtk::igeneric_function<T>
method dotk (line 38186) | dotk()
method T (line 38195) | inline T operator() (const std::size_t& ps_index, parameter_list...
type package (line 38221) | struct package
method register_package (line 38245) | bool register_package(exprtk::symbol_table<T>& symtab)
type information (line 38292) | namespace information
function data (line 38299) | static inline std::string data()
type lexer (line 2021) | namespace lexer
type token (line 2023) | struct token
type token_type (line 2025) | enum token_type
method token (line 2043) | token()
method clear (line 2049) | void clear()
method token (line 2057) | inline token& set_operator(const token_type tt,
method token (line 2069) | inline token& set_symbol(const Iterator begin, const Iterator end, c...
method token (line 2078) | inline token& set_symbol(const std::string& s, const std::size_t p)
method token (line 2087) | inline token& set_numeric(const Iterator begin, const Iterator end, ...
method token (line 2097) | inline token& set_string(const Iterator begin, const Iterator end, c...
method token (line 2106) | inline token& set_string(const std::string& s, const std::size_t p)
method token (line 2115) | inline token& set_error(const token_type et,
method to_str (line 2140) | static inline std::string to_str(token_type t)
method is_error (line 2187) | inline bool is_error() const
function scan_operator (line 2203) | class generator
function scan_symbol (line 2579) | inline void scan_symbol()
function scan_number (line 2632) | inline void scan_number()
function scan_special_function (line 2738) | inline void scan_special_function()
function scan_string (line 2774) | inline void scan_string()
class helper_interface (line 2890) | class helper_interface
method init (line 2894) | virtual void init() { }
method reset (line 2895) | virtual void reset() { }
method result (line 2896) | virtual bool result() { return true; }
method process (line 2897) | virtual std::size_t process(generator&) { return 0; }
class token_scanner (line 2901) | class token_scanner : public helper_interface
method token_scanner (line 2908) | explicit token_scanner(const std::size_t& stride)
method process (line 2917) | inline std::size_t process(generator& g)
class token_modifier (line 3008) | class token_modifier : public helper_interface
method process (line 3012) | inline std::size_t process(generator& g)
class token_inserter (line 3027) | class token_inserter : public helper_interface
method token_inserter (line 3031) | explicit token_inserter(const std::size_t& stride)
method process (line 3040) | inline std::size_t process(generator& g)
class token_joiner (line 3113) | class token_joiner : public helper_interface
method token_joiner (line 3117) | token_joiner(const std::size_t& stride)
method process (line 3121) | inline std::size_t process(generator& g)
method join (line 3134) | virtual bool join(const token&, const token&, token&) { ...
method join (line 3135) | virtual bool join(const token&, const token&, const token&, token&) { ...
method process_stride_2 (line 3139) | inline std::size_t process_stride_2(generator& g)
method process_stride_3 (line 3165) | inline std::size_t process_stride_3(generator& g)
type helper (line 3194) | namespace helper
function dump (line 3197) | inline void dump(lexer::generator& generator)
class commutative_inserter (line 3210) | class commutative_inserter : public lexer::token_inserter
method commutative_inserter (line 3216) | commutative_inserter()
method ignore_symbol (line 3220) | inline void ignore_symbol(const std::string& symbol)
method insert (line 3225) | inline int insert(const lexer::token& t0, const lexer::token& t1, le...
class operator_joiner (line 3271) | class operator_joiner : public token_joiner
method operator_joiner (line 3275) | operator_joiner(const std::size_t& stride)
method join (line 3279) | inline bool join(const lexer::token& t0, const lexer::token& t1, lex...
method join (line 3424) | inline bool join(const lexer::token& t0, const lexer::token& t1, con...
class bracket_checker (line 3444) | class bracket_checker : public lexer::token_scanner
method bracket_checker (line 3450) | bracket_checker()
method result (line 3455) | bool result()
method error_token (line 3471) | lexer::token error_token()
method reset (line 3476) | void reset()
class numeric_checker (line 3529) | class numeric_checker : public lexer::token_scanner
method numeric_checker (line 3535) | numeric_checker()
method result (line 3540) | bool result()
method reset (line 3545) | void reset()
method error_count (line 3568) | std::size_t error_count() const
method error_index (line 3573) | std::size_t error_index(const std::size_t& i)
method clear_errors (line 3581) | void clear_errors()
class symbol_replacer (line 3592) | class symbol_replacer : public lexer::token_modifier
method remove (line 3600) | bool remove(const std::string& target_symbol)
method add_replace (line 3612) | bool add_replace(const std::string& target_symbol,
method clear (line 3628) | void clear()
method modify (line 3635) | bool modify(lexer::token& t)
class sequence_validator (line 3659) | class sequence_validator : public lexer::token_scanner
method sequence_validator (line 3670) | sequence_validator()
method result (line 3697) | bool result()
method error_count (line 3718) | std::size_t error_count() const
method error (line 3723) | std::pair<lexer::token,lexer::token> error(const std::size_t index)
method clear_errors (line 3736) | void clear_errors()
method add_invalid (line 3743) | void add_invalid(lexer::token::token_type base, lexer::token::token_...
method add_invalid_set1 (line 3748) | void add_invalid_set1(lexer::token::token_type t)
method invalid_bracket_check (line 3767) | bool invalid_bracket_check(lexer::token::token_type base, lexer::tok...
type helper_assembly (line 3830) | struct helper_assembly
method register_scanner (line 3832) | inline bool register_scanner(lexer::token_scanner* scanner)
method register_modifier (line 3846) | inline bool register_modifier(lexer::token_modifier* modifier)
method register_joiner (line 3860) | inline bool register_joiner(lexer::token_joiner* joiner)
method register_inserter (line 3874) | inline bool register_inserter(lexer::token_inserter* inserter)
method run_modifiers (line 3888) | inline bool run_modifiers(lexer::generator& g)
method run_joiners (line 3910) | inline bool run_joiners(lexer::generator& g)
method run_inserters (line 3932) | inline bool run_inserters(lexer::generator& g)
method run_scanners (line 3954) | inline bool run_scanners(lexer::generator& g)
class parser_helper (line 3988) | class parser_helper
method init (line 3995) | inline bool init(const std::string& str)
method generator_t (line 4009) | inline generator_t& lexer()
method generator_t (line 4014) | inline const generator_t& lexer() const
method store_token (line 4019) | inline void store_token()
method restore_token (line 4025) | inline void restore_token()
method next_token (line 4031) | inline void next_token()
method token_t (line 4036) | inline const token_t& current_token() const
type token_advance_mode (line 4041) | enum token_advance_mode
method advance_token (line 4047) | inline void advance_token(const token_advance_mode mode)
method token_is (line 4055) | inline bool token_is(const token_t::token_type& ttype, const token_adv...
method token_is (line 4067) | inline bool token_is(const token_t::token_type& ttype,
method peek_token_is (line 4084) | inline bool peek_token_is(const token_t::token_type& ttype)
method peek_token_is (line 4089) | inline bool peek_token_is(const std::string& s)
class vector_view (line 4103) | class vector_view
method vector_view (line 4109) | vector_view(data_ptr_t data, const std::size_t& size)
method vector_view (line 4115) | vector_view(const vector_view<T>& vv)
method rebase (line 4121) | inline void rebase(data_ptr_t data)
method data_ptr_t (line 4134) | inline data_ptr_t data() const
method size (line 4139) | inline std::size_t size() const
method T (line 4144) | inline const T& operator[](const std::size_t index) const
method T (line 4149) | inline T& operator[](const std::size_t index)
method set_ref (line 4154) | void set_ref(data_ptr_t* data_ref)
function make_vector_view (line 4167) | inline vector_view<T> make_vector_view(T* data,
function make_vector_view (line 4174) | inline vector_view<T> make_vector_view(std::vector<T>& v,
class results_context (line 4180) | class results_context
method results_context (line 4381) | results_context()
method count (line 4385) | inline std::size_t count() const
method type_store_t (line 4393) | inline type_store_t& operator[](const std::size_t& index)
method type_store_t (line 4398) | inline const type_store_t& operator[](const std::size_t& index) const
method clear (line 4405) | inline void clear()
method assign (line 4413) | inline void assign(const parameter_list_t& pl)
type type_store (line 4183) | struct type_store
type store_type (line 4185) | enum store_type
method type_store (line 4193) | type_store()
class parameter_list (line 4203) | class parameter_list
method parameter_list (line 4207) | parameter_list(std::vector<type_store>& pl)
method empty (line 4211) | inline bool empty() const
method size (line 4216) | inline std::size_t size() const
method type_store (line 4221) | inline type_store& operator[](const std::size_t& index)
method type_store (line 4226) | inline const type_store& operator[](const std::size_t& index) const
method type_store (line 4231) | inline type_store& front()
method type_store (line 4236) | inline const type_store& front() const
method type_store (line 4241) | inline type_store& back()
method type_store (line 4246) | inline const type_store& back() const
type type_view (line 4259) | struct type_view
method type_view (line 4264) | type_view(type_store_t& ts)
method type_view (line 4269) | type_view(const type_store_t& ts)
method size (line 4274) | inline std::size_t size() const
method value_t (line 4279) | inline value_t& operator[](const std::size_t& i)
method value_t (line 4284) | inline const value_t& operator[](const std::size_t& i) const
method value_t (line 4289) | inline const value_t* begin() const { return data_; }
method value_t (line 4290) | inline value_t* begin() { return data_; }
method value_t (line 4292) | inline const value_t* end() const
method value_t (line 4297) | inline value_t* end()
type scalar_view (line 4309) | struct scalar_view
method scalar_view (line 4314) | scalar_view(type_store_t& ts)
method scalar_view (line 4318) | scalar_view(const type_store_t& ts)
method value_t (line 4322) | inline value_t& operator() ()
method value_t (line 4327) | inline const value_t& operator() () const
method to_int (line 4333) | inline bool to_int(IntType& i) const
method to_uint (line 4344) | inline bool to_uint(UIntType& u) const
function to_str (line 4361) | inline std::string to_str(const StringView& view)
type details (line 4367) | namespace details
class return_node (line 4369) | class return_node
class return_envelope_node (line 4370) | class return_envelope_node
type operator_type (line 4430) | enum operator_type
function to_str (line 4502) | inline std::string to_str(const operator_type opr)
type base_operation_t (line 4530) | struct base_operation_t
method base_operation_t (line 4532) | base_operation_t(const operator_type t, const unsigned int& np)
type loop_unroll (line 4541) | namespace loop_unroll
type details (line 4549) | struct details
method details (line 4551) | details(const std::size_t& vsize,
function dump_ptr (line 4565) | inline void dump_ptr(const std::string& s, const void* ptr, const std:...
function dump_ptr (line 4576) | inline void dump_ptr(const std::string&, const void*) {}
function dump_ptr (line 4577) | inline void dump_ptr(const std::string&, const void*, const std::size_...
class vec_data_store (line 4581) | class vec_data_store
type control_block (line 4590) | struct control_block
method control_block (line 4592) | control_block()
method control_block (line 4599) | control_block(const std::size_t& dsize)
method control_block (line 4606) | control_block(const std::size_t& dsize, data_t dptr, bool dstrct =...
method control_block (line 4623) | static inline control_block* create(const std::size_t& dsize, data...
method destroy (line 4636) | static inline void destroy(control_block*& cntrl_blck)
method create_data (line 4662) | inline void create_data()
method vec_data_store (line 4673) | vec_data_store()
method vec_data_store (line 4677) | vec_data_store(const std::size_t& size)
method vec_data_store (line 4681) | vec_data_store(const std::size_t& size, data_t data, bool dstrct = f...
method vec_data_store (line 4685) | vec_data_store(const type& vds)
method type (line 4696) | type& operator=(const type& vds)
method data_t (line 4717) | inline data_t data()
method data_t (line 4722) | inline data_t data() const
method size (line 4727) | inline std::size_t size()
method size (line 4732) | inline std::size_t size() const
method data_t (line 4737) | inline data_t& ref()
method dump (line 4742) | inline void dump() const
method match_sizes (line 4761) | static inline void match_sizes(type& vds0, type& vds1)
method min_size (line 4770) | static inline std::size_t min_size(control_block* cb0, control_block...
type numeric (line 4784) | namespace numeric
type details (line 4786) | namespace details
function T (line 4789) | inline T process_impl(const operator_type operation, const T arg)
function T (line 4840) | inline T process_impl(const operator_type operation, const T arg0,...
function T (line 4880) | inline T process_impl(const operator_type operation, const T arg0,...
function T (line 4919) | inline T process(const operator_type operation, const T arg)
function T (line 4925) | inline T process(const operator_type operation, const T arg0, const ...
class expression_node (line 4932) | class expression_node
type node_type (line 4936) | enum node_type
method T (line 4983) | inline virtual T value() const
method node_type (line 4993) | inline virtual node_type type() const
function is_true (line 5002) | inline bool is_true(const double v)
function is_true (line 5007) | inline bool is_true(const long double v)
function is_true (line 5012) | inline bool is_true(const float v)
function is_true (line 5018) | inline bool is_true(const std::complex<T>& v)
function is_true (line 5024) | inline bool is_true(const expression_node<T>* node)
function is_false (line 5030) | inline bool is_false(const expression_node<T>* node)
function is_unary_node (line 5036) | inline bool is_unary_node(const expression_node<T>* node)
function is_neg_unary_node (line 5042) | inline bool is_neg_unary_node(const expression_node<T>* node)
function is_binary_node (line 5048) | inline bool is_binary_node(const expression_node<T>* node)
function is_variable_node (line 5054) | inline bool is_variable_node(const expression_node<T>* node)
function is_ivariable_node (line 5060) | inline bool is_ivariable_node(const expression_node<T>* node)
function is_vector_elem_node (line 5072) | inline bool is_vector_elem_node(const expression_node<T>* node)
function is_rebasevector_elem_node (line 5078) | inline bool is_rebasevector_elem_node(const expression_node<T>* node)
function is_rebasevector_celem_node (line 5084) | inline bool is_rebasevector_celem_node(const expression_node<T>* node)
function is_vector_node (line 5090) | inline bool is_vector_node(const expression_node<T>* node)
function is_ivector_node (line 5096) | inline bool is_ivector_node(const expression_node<T>* node)
function is_constant_node (line 5120) | inline bool is_constant_node(const expression_node<T>* node)
function is_null_node (line 5126) | inline bool is_null_node(const expression_node<T>* node)
function is_break_node (line 5132) | inline bool is_break_node(const expression_node<T>* node)
function is_continue_node (line 5138) | inline bool is_continue_node(const expression_node<T>* node)
function is_swap_node (line 5144) | inline bool is_swap_node(const expression_node<T>* node)
function is_function (line 5150) | inline bool is_function(const expression_node<T>* node)
function is_return_node (line 5156) | inline bool is_return_node(const expression_node<T>* node)
class unary_node (line 5161) | class unary_node
method unary_node (line 5694) | unary_node(const operator_type& opr,
method T (line 5709) | inline T value() const
method type (line 5716) | inline typename expression_node<T>::node_type type() const
method operator_type (line 5721) | inline operator_type operation() const
method release (line 5731) | inline void release()
function is_negate_node (line 5164) | inline bool is_negate_node(const expression_node<T>* node)
function branch_deletable (line 5175) | inline bool branch_deletable(expression_node<T>* node)
function all_nodes_valid (line 5182) | inline bool all_nodes_valid(expression_node<T>* (&b)[N])
function all_nodes_valid (line 5195) | inline bool all_nodes_valid(const Sequence<expression_node<T>*,Allocat...
function all_nodes_variables (line 5206) | inline bool all_nodes_variables(expression_node<T>* (&b)[N])
function all_nodes_variables (line 5222) | inline bool all_nodes_variables(Sequence<expression_node<T>*,Allocator...
function free_all_nodes (line 5236) | inline void free_all_nodes(NodeAllocator& node_allocator, expression_n...
function free_all_nodes (line 5248) | inline void free_all_nodes(NodeAllocator& node_allocator, Sequence<exp...
function free_node (line 5259) | inline void free_node(NodeAllocator& node_allocator, expression_node<T...
function destroy_node (line 5275) | inline void destroy_node(expression_node<T>*& node)
class vector_holder (line 5282) | class vector_holder
class vector_holder_base (line 5290) | class vector_holder_base
method value_ptr (line 5296) | inline value_ptr operator[](const std::size_t& index) const
method size (line 5301) | inline std::size_t size() const
method value_ptr (line 5306) | inline value_ptr data() const
method rebaseable (line 5311) | virtual inline bool rebaseable() const
method set_ref (line 5316) | virtual void set_ref(value_ptr*) {}
class array_vector_impl (line 5324) | class array_vector_impl : public vector_holder_base
method array_vector_impl (line 5328) | array_vector_impl(const Type* vec, const std::size_t& vec_size)
method value_ptr (line 5335) | value_ptr value_at(const std::size_t& index) const
method vector_size (line 5343) | std::size_t vector_size() const
class sequence_vector_impl (line 5358) | class sequence_vector_impl : public vector_holder_base
method sequence_vector_impl (line 5364) | sequence_vector_impl(sequence_t& seq)
method value_ptr (line 5370) | value_ptr value_at(const std::size_t& index) const
method vector_size (line 5375) | std::size_t vector_size() const
class vector_view_impl (line 5387) | class vector_view_impl : public vector_holder_base
method vector_view_impl (line 5393) | vector_view_impl(vector_view_t& vec_view)
method set_ref (line 5397) | void set_ref(value_ptr* ref)
method rebaseable (line 5402) | virtual inline bool rebaseable() const
method value_ptr (line 5409) | value_ptr value_at(const std::size_t& index) const
method vector_size (line 5414) | std::size_t vector_size() const
method vector_holder (line 5430) | vector_holder(Type* vec, const std::size_t& vec_size)
method vector_holder (line 5434) | vector_holder(const vds_t& vds)
method vector_holder (line 5439) | vector_holder(std::vector<Type,Allocator>& vec)
method vector_holder (line 5443) | vector_holder(exprtk::vector_view<Type>& vec)
method value_ptr (line 5447) | inline value_ptr operator[](const std::size_t& index) const
method size (line 5452) | inline std::size_t size() const
method value_ptr (line 5457) | inline value_ptr data() const
method set_ref (line 5462) | void set_ref(value_ptr* ref)
method rebaseable (line 5467) | bool rebaseable() const
class null_node (line 5479) | class null_node : public expression_node<T>
method T (line 5483) | inline T value() const
method type (line 5488) | inline typename expression_node<T>::node_type type() const
class null_eq_node (line 5495) | class null_eq_node : public expression_node<T>
method null_eq_node (line 5501) | null_eq_node(expression_ptr brnch, const bool equality = true)
method T (line 5515) | inline T value() const
method type (line 5526) | inline typename expression_node<T>::node_type type() const
method operator_type (line 5531) | inline operator_type operation() const
class literal_node (line 5549) | class literal_node : public expression_node<T>
method literal_node (line 5553) | explicit literal_node(const T& v)
method T (line 5557) | inline T value() const
method type (line 5562) | inline typename expression_node<T>::node_type type() const
method literal_node (line 5574) | literal_node(literal_node<T>&) {}
type range_pack (line 5581) | struct range_pack
method range_pack (line 6869) | range_pack()
method clear (line 6877) | void clear()
method free (line 6886) | void free()
method const_range (line 6915) | bool const_range()
method var_range (line 6921) | bool var_range()
method const_size (line 6971) | inline std::size_t const_size() const
method cache_size (line 6976) | inline std::size_t cache_size() const
type range_data_type (line 5584) | struct range_data_type
method range_data_type (line 6997) | range_data_type()
class range_interface (line 5587) | class range_interface
class string_base_node (line 5603) | class string_base_node
class string_literal_node (line 5620) | class string_literal_node : public expression_node <T>,
method string_literal_node (line 5628) | explicit string_literal_node(const std::string& v)
method T (line 5637) | inline T value() const
method type (line 5642) | inline typename expression_node<T>::node_type type() const
method str (line 5652) | std::string str() const
method char_cptr (line 5657) | char_cptr base() const
method size (line 5662) | std::size_t size() const
method range_t (line 5667) | range_t& range_ref()
method range_t (line 5672) | const range_t& range_ref() const
class unary_node (line 5688) | class unary_node : public expression_node<T>
method unary_node (line 5694) | unary_node(const operator_type& opr,
method T (line 5709) | inline T value() const
method type (line 5716) | inline typename expression_node<T>::node_type type() const
method operator_type (line 5721) | inline operator_type operation() const
method release (line 5731) | inline void release()
type construct_branch_pair (line 5744) | struct construct_branch_pair
method process (line 5747) | static inline void process(std::pair<expression_node<T>*,bool> (&)[N...
type construct_branch_pair<T,D,true> (line 5752) | struct construct_branch_pair<T,D,true>
method process (line 5755) | static inline void process(std::pair<expression_node<T>*,bool> (&bra...
function init_branches (line 5765) | inline void init_branches(std::pair<expression_node<T>*,bool> (&branch...
type cleanup_branches (line 5789) | struct cleanup_branches
method execute (line 5792) | static inline void execute(std::pair<expression_node<T>*,bool> (&bra...
method execute (line 5806) | static inline void execute(Sequence<std::pair<expression_node<T>*,bo...
class binary_node (line 5819) | class binary_node : public expression_node<T>
method binary_node (line 5826) | binary_node(const operator_type& opr,
method T (line 5839) | inline T value() const
method type (line 5847) | inline typename expression_node<T>::node_type type() const
method operator_type (line 5852) | inline operator_type operation()
class binary_ext_node (line 5874) | class binary_ext_node : public expression_node<T>
method binary_ext_node (line 5881) | binary_ext_node(expression_ptr branch0, expression_ptr branch1)
method T (line 5891) | inline T value() const
method type (line 5899) | inline typename expression_node<T>::node_type type() const
method operator_type (line 5904) | inline operator_type operation()
class trinary_node (line 5925) | class trinary_node : public expression_node<T>
method trinary_node (line 5932) | trinary_node(const operator_type& opr,
method T (line 5946) | inline T value() const
method type (line 5968) | inline typename expression_node<T>::node_type type() const
class quaternary_node (line 5980) | class quaternary_node : public expression_node<T>
method quaternary_node (line 5987) | quaternary_node(const operator_type& opr,
method T (line 6002) | inline T value() const
method type (line 6007) | inline typename expression_node<T>::node_type type() const
class conditional_node (line 6019) | class conditional_node : public expression_node<T>
method conditional_node (line 6025) | conditional_node(expression_ptr test,
method T (line 6054) | inline T value() const
method type (line 6062) | inline typename expression_node<T>::node_type type() const
class cons_conditional_node (line 6078) | class cons_conditional_node : public expression_node<T>
method cons_conditional_node (line 6085) | cons_conditional_node(expression_ptr test,
method T (line 6106) | inline T value() const
method type (line 6114) | inline typename expression_node<T>::node_type type() const
class break_exception (line 6129) | class break_exception
method break_exception (line 6133) | break_exception(const T& v)
class continue_exception (line 6140) | class continue_exception
class break_node (line 6144) | class break_node : public expression_node<T>
method break_node (line 6150) | break_node(expression_ptr ret = expression_ptr(0))
method T (line 6163) | inline T value() const
method type (line 6171) | inline typename expression_node<T>::node_type type() const
class continue_node (line 6183) | class continue_node : public expression_node<T>
method T (line 6187) | inline T value() const
method type (line 6195) | inline typename expression_node<T>::node_type type() const
class while_loop_node (line 6203) | class while_loop_node : public expression_node<T>
method while_loop_node (line 6209) | while_loop_node(expression_ptr condition, expression_ptr loop_body)
method T (line 6229) | inline T value() const
method type (line 6241) | inline typename expression_node<T>::node_type type() const
class repeat_until_loop_node (line 6255) | class repeat_until_loop_node : public expression_node<T>
method repeat_until_loop_node (line 6261) | repeat_until_loop_node(expression_ptr condition, expression_ptr loop...
method T (line 6281) | inline T value() const
method type (line 6294) | inline typename expression_node<T>::node_type type() const
class for_loop_node (line 6308) | class for_loop_node : public expression_node<T>
method for_loop_node (line 6314) | for_loop_node(expression_ptr initialiser,
method T (line 6351) | inline T value() const
method type (line 6377) | inline typename expression_node<T>::node_type type() const
class while_loop_bc_node (line 6396) | class while_loop_bc_node : public expression_node<T>
method while_loop_bc_node (line 6402) | while_loop_bc_node(expression_ptr condition, expression_ptr loop_body)
method T (line 6422) | inline T value() const
method type (line 6443) | inline typename expression_node<T>::node_type type() const
class repeat_until_loop_bc_node (line 6457) | class repeat_until_loop_bc_node : public expression_node<T>
method repeat_until_loop_bc_node (line 6463) | repeat_until_loop_bc_node(expression_ptr condition, expression_ptr l...
method T (line 6483) | inline T value() const
method type (line 6505) | inline typename expression_node<T>::node_type type() const
class for_loop_bc_node (line 6519) | class for_loop_bc_node : public expression_node<T>
method for_loop_bc_node (line 6525) | for_loop_bc_node(expression_ptr initialiser,
method T (line 6562) | inline T value() const
method type (line 6607) | inline typename expression_node<T>::node_type type() const
class switch_node (line 6626) | class switch_node : public expression_node<T>
method switch_node (line 6634) | switch_node(const Sequence<expression_ptr,Allocator>& arg_list)
method T (line 6669) | inline T value() const
method type (line 6692) | inline typename expression_node<T>::node_type type() const
class switch_n_node (line 6704) | class switch_n_node : public switch_node<T>
method switch_n_node (line 6712) | switch_n_node(const Sequence<expression_ptr,Allocator>& arg_list)
method T (line 6716) | inline T value() const
class multi_switch_node (line 6723) | class multi_switch_node : public expression_node<T>
method multi_switch_node (line 6731) | multi_switch_node(const Sequence<expression_ptr,Allocator>& arg_list)
method T (line 6766) | inline T value() const
method type (line 6791) | inline typename expression_node<T>::node_type type() const
class ivariable (line 6803) | class ivariable
class variable_node (line 6815) | class variable_node : public expression_node<T>,
method variable_node (line 6822) | explicit variable_node()
method variable_node (line 6826) | variable_node(T& v)
method T (line 6835) | inline T value() const
method T (line 6840) | inline T& ref()
method T (line 6845) | inline const T& ref() const
method type (line 6850) | inline typename expression_node<T>::node_type type() const
type range_pack (line 6864) | struct range_pack
method range_pack (line 6869) | range_pack()
method clear (line 6877) | void clear()
method free (line 6886) | void free()
method const_range (line 6915) | bool const_range()
method var_range (line 6921) | bool var_range()
method const_size (line 6971) | inline std::size_t const_size() const
method cache_size (line 6976) | inline std::size_t cache_size() const
class string_base_node (line 6989) | class string_base_node
type range_data_type (line 6992) | struct range_data_type
method range_data_type (line 6997) | range_data_type()
class vector_node (line 7012) | class vector_node
method vector_node (line 7049) | vector_node(vector_holder_t* vh)
method vector_node (line 7056) | vector_node(const vds_t& vds, vector_holder_t* vh)
method T (line 7061) | inline T value() const
method vector_node_ptr (line 7066) | vector_node_ptr vec() const
method vector_node_ptr (line 7071) | vector_node_ptr vec()
method type (line 7076) | inline typename expression_node<T>::node_type type() const
method size (line 7081) | std::size_t size() const
method vds_t (line 7086) | vds_t& vds()
method vds_t (line 7091) | const vds_t& vds() const
method vector_holder_t (line 7096) | inline vector_holder_t& vec_holder()
class vector_interface (line 7015) | class vector_interface
method side_effect (line 7035) | virtual bool side_effect () const { return false; }
class vector_node (line 7039) | class vector_node : public expression_node <T>,
method vector_node (line 7049) | vector_node(vector_holder_t* vh)
method vector_node (line 7056) | vector_node(const vds_t& vds, vector_holder_t* vh)
method T (line 7061) | inline T value() const
method vector_node_ptr (line 7066) | vector_node_ptr vec() const
method vector_node_ptr (line 7071) | vector_node_ptr vec()
method type (line 7076) | inline typename expression_node<T>::node_type type() const
method size (line 7081) | std::size_t size() const
method vds_t (line 7086) | vds_t& vds()
method vds_t (line 7091) | const vds_t& vds() const
method vector_holder_t (line 7096) | inline vector_holder_t& vec_holder()
class vector_elem_node (line 7108) | class vector_elem_node : public expression_node<T>,
method vector_elem_node (line 7117) | vector_elem_node(expression_ptr index, vector_holder_ptr vec_holder)
method T (line 7132) | inline T value() const
method T (line 7137) | inline T& ref()
method T (line 7142) | inline const T& ref() const
method type (line 7147) | inline typename expression_node<T>::node_type type() const
method vector_holder_t (line 7152) | inline vector_holder_t& vec_holder()
class rebasevector_elem_node (line 7166) | class rebasevector_elem_node : public expression_node<T>,
method rebasevector_elem_node (line 7176) | rebasevector_elem_node(expression_ptr index, vector_holder_ptr vec_h...
method T (line 7193) | inline T value() const
method T (line 7198) | inline T& ref()
method T (line 7203) | inline const T& ref() const
method type (line 7208) | inline typename expression_node<T>::node_type type() const
method vector_holder_t (line 7213) | inline vector_holder_t& vec_holder()
class rebasevector_celem_node (line 7227) | class rebasevector_celem_node : public expression_node<T>,
method rebasevector_celem_node (line 7237) | rebasevector_celem_node(const std::size_t index, vector_holder_ptr v...
method T (line 7245) | inline T value() const
method T (line 7250) | inline T& ref()
method T (line 7255) | inline const T& ref() const
method type (line 7260) | inline typename expression_node<T>::node_type type() const
method vector_holder_t (line 7265) | inline vector_holder_t& vec_holder()
class vector_assignment_node (line 7278) | class vector_assignment_node : public expression_node<T>
method vector_assignment_node (line 7284) | vector_assignment_node(T* vector_base,
method T (line 7305) | inline T value() const
method type (line 7335) | inline typename expression_node<T>::node_type type() const
class swap_node (line 7351) | class swap_node : public expression_node<T>
method swap_node (line 7358) | swap_node(variable_node_ptr var0, variable_node_ptr var1)
method T (line 7363) | inline T value() const
method type (line 7369) | inline typename expression_node<T>::node_type type() const
class swap_generic_node (line 7381) | class swap_generic_node : public binary_node<T>
method swap_generic_node (line 7388) | swap_generic_node(expression_ptr var0, expression_ptr var1)
method T (line 7394) | inline T value() const
method type (line 7400) | inline typename expression_node<T>::node_type type() const
class swap_vecvec_node (line 7412) | class swap_vecvec_node : public binary_node <T>,
method swap_vecvec_node (line 7421) | swap_vecvec_node(expression_ptr branch0,
method T (line 7459) | inline T value() const
method vector_node_ptr (line 7480) | vector_node_ptr vec() const
method vector_node_ptr (line 7485) | vector_node_ptr vec()
method type (line 7490) | inline typename expression_node<T>::node_type type() const
method size (line 7495) | std::size_t size() const
method vds_t (line 7500) | vds_t& vds()
method vds_t (line 7505) | const vds_t& vds() const
class stringvar_node (line 7521) | class stringvar_node : public expression_node <T>,
method stringvar_node (line 7531) | explicit stringvar_node()
method stringvar_node (line 7535) | explicit stringvar_node(std::string& v)
method T (line 7549) | inline T value() const
method str (line 7557) | std::string str() const
method char_cptr (line 7562) | char_cptr base() const
method size (line 7567) | std::size_t size() const
method range_t (line 7582) | range_t& range_ref()
method range_t (line 7587) | const range_t& range_ref() const
method type (line 7592) | inline typename expression_node<T>::node_type type() const
class string_range_node (line 7607) | class string_range_node : public expression_node <T>,
method string_range_node (line 7617) | explicit string_range_node(std::string& v, const range_t& rp)
method T (line 7632) | inline T value() const
method str (line 7637) | inline std::string str() const
method char_cptr (line 7642) | char_cptr base() const
method size (line 7647) | std::size_t size() const
method range_t (line 7652) | inline range_t range() const
method range_t (line 7667) | inline range_t& range_ref()
method range_t (line 7672) | inline const range_t& range_ref() const
method type (line 7677) | inline typename expression_node<T>::node_type type() const
class const_string_range_node (line 7692) | class const_string_range_node : public expression_node <T>,
method const_string_range_node (line 7700) | explicit const_string_range_node(const std::string& v, const range_t...
method T (line 7710) | inline T value() const
method str (line 7715) | std::string str() const
method char_cptr (line 7720) | char_cptr base() const
method size (line 7725) | std::size_t size() const
method range_t (line 7730) | range_t range() const
method range_t (line 7735) | range_t& range_ref()
method range_t (line 7740) | const range_t& range_ref() const
method type (line 7745) | inline typename expression_node<T>::node_type type() const
class generic_string_range_node (line 7759) | class generic_string_range_node : public expression_node <T>,
method generic_string_range_node (line 7773) | generic_string_range_node(expression_ptr str_branch, const range_t& ...
method T (line 7812) | inline T value() const
method str (line 7845) | std::string str() const
method char_cptr (line 7850) | char_cptr base() const
method size (line 7855) | std::size_t size() const
method range_t (line 7860) | range_t& range_ref()
method range_t (line 7865) | const range_t& range_ref() const
method type (line 7870) | inline typename expression_node<T>::node_type type() const
class string_concat_node (line 7888) | class string_concat_node : public binary_node <T>,
method string_concat_node (line 7901) | string_concat_node(const operator_type& opr,
method T (line 7949) | inline T value() const
method str (line 7984) | std::string str() const
method char_cptr (line 7989) | char_cptr base() const
method size (line 7994) | std::size_t size() const
method range_t (line 7999) | range_t& range_ref()
method range_t (line 8004) | const range_t& range_ref() const
method type (line 8009) | inline typename expression_node<T>::node_type type() const
class swap_string_node (line 8026) | class swap_string_node : public binary_node <T>,
method swap_string_node (line 8040) | swap_string_node(expression_ptr branch0, expression_ptr branch1)
method T (line 8059) | inline T value() const
method str (line 8072) | std::string str() const
method char_cptr (line 8077) | char_cptr base() const
method size (line 8082) | std::size_t size() const
method range_t (line 8087) | range_t& range_ref()
method range_t (line 8092) | const range_t& range_ref() const
method type (line 8097) | inline typename expression_node<T>::node_type type() const
class swap_genstrings_node (line 8110) | class swap_genstrings_node : public binary_node<T>
method swap_genstrings_node (line 8121) | swap_genstrings_node(expression_ptr branch0,
method T (line 8166) | inline T value() const
method type (line 8246) | inline typename expression_node<T>::node_type type() const
class stringvar_size_node (line 8264) | class stringvar_size_node : public expression_node<T>
method stringvar_size_node (line 8270) | explicit stringvar_size_node()
method stringvar_size_node (line 8274) | explicit stringvar_size_node(std::string& v)
method T (line 8278) | inline T value() const
method type (line 8283) | inline typename expression_node<T>::node_type type() const
class string_size_node (line 8297) | class string_size_node : public expression_node<T>
method string_size_node (line 8304) | string_size_node(expression_ptr brnch)
method T (line 8326) | inline T value() const
method type (line 8339) | inline typename expression_node<T>::node_type type() const
type asn_assignment (line 8351) | struct asn_assignment
method execute (line 8353) | static inline void execute(std::string& s, char_cptr data, const std...
type asn_addassignment (line 8357) | struct asn_addassignment
method execute (line 8359) | static inline void execute(std::string& s, char_cptr data, const std...
class assignment_string_node (line 8364) | class assignment_string_node : public binary_node <T>,
method assignment_string_node (line 8378) | assignment_string_node(const operator_type& opr,
method T (line 8416) | inline T value() const
method str (line 8440) | std::string str() const
method char_cptr (line 8445) | char_cptr base() const
method size (line 8450) | std::size_t size() const
method range_t (line 8455) | range_t& range_ref()
method range_t (line 8460) | const range_t& range_ref() const
method type (line 8465) | inline typename expression_node<T>::node_type type() const
class assignment_string_range_node (line 8480) | class assignment_string_range_node : public binary_node <T>,
method assignment_string_range_node (line 8494) | assignment_string_range_node(const operator_type& opr,
method T (line 8541) | inline T value() const
method str (line 8573) | std::string str() const
method char_cptr (line 8578) | char_cptr base() const
method size (line 8583) | std::size_t size() const
method range_t (line 8588) | range_t& range_ref()
method range_t (line 8593) | const range_t& range_ref() const
method type (line 8598) | inline typename expression_node<T>::node_type type() const
class conditional_string_node (line 8614) | class conditional_string_node : public trinary_node <T>,
method conditional_string_node (line 8627) | conditional_string_node(expression_ptr test,
method T (line 8679) | inline T value() const
method str (line 8727) | std::string str() const
method char_cptr (line 8732) | char_cptr base() const
method size (line 8737) | std::size_t size() const
method range_t (line 8742) | range_t& range_ref()
method range_t (line 8747) | const range_t& range_ref() const
method type (line 8752) | inline typename expression_node<T>::node_type type() const
class cons_conditional_str_node (line 8773) | class cons_conditional_str_node : public binary_node <T>,
method cons_conditional_str_node (line 8786) | cons_conditional_str_node(expression_ptr test,
method T (line 8817) | inline T value() const
method str (line 8847) | std::string str() const
method char_cptr (line 8852) | char_cptr base() const
method size (line 8857) | std::size_t size() const
method range_t (line 8862) | range_t& range_ref()
method range_t (line 8867) | const range_t& range_ref() const
method type (line 8872) | inline typename expression_node<T>::node_type type() const
class str_vararg_node (line 8890) | class str_vararg_node : public expression_node <T>,
method str_vararg_node (line 8905) | str_vararg_node(const Sequence<expression_ptr,Allocator>& arg_list)
method T (line 8969) | inline T value() const
method str (line 8981) | std::string str() const
method char_cptr (line 8986) | char_cptr base() const
method size (line 8991) | std::size_t size() const
method range_t (line 8996) | range_t& range_ref()
method range_t (line 9001) | const range_t& range_ref() const
method type (line 9006) | inline typename expression_node<T>::node_type type() const
function T (line 9024) | inline T axn(T a, T x)
function T (line 9031) | inline T axnb(T a, T x, T b)
type sf_base (line 9038) | struct sf_base
class sf3_node (line 9245) | class sf3_node : public trinary_node<T>
method sf3_node (line 9251) | sf3_node(const operator_type& opr,
method T (line 9258) | inline T value() const
class sf4_node (line 9269) | class sf4_node : public quaternary_node<T>
method sf4_node (line 9275) | sf4_node(const operator_type& opr,
method T (line 9283) | inline T value() const
class sf3_var_node (line 9295) | class sf3_var_node : public expression_node<T>
method sf3_var_node (line 9301) | sf3_var_node(const T& v0, const T& v1, const T& v2)
method T (line 9307) | inline T value() const
method type (line 9312) | inline typename expression_node<T>::node_type type() const
class sf4_var_node (line 9328) | class sf4_var_node : public expression_node<T>
method sf4_var_node (line 9334) | sf4_var_node(const T& v0, const T& v1, const T& v2, const T& v3)
method T (line 9341) | inline T value() const
method type (line 9346) | inline typename expression_node<T>::node_type type() const
class vararg_node (line 9363) | class vararg_node : public expression_node<T>
method vararg_node (line 9371) | vararg_node(const Sequence<expression_ptr,Allocator>& arg_list)
method T (line 9403) | inline T value() const
method type (line 9411) | inline typename expression_node<T>::node_type type() const
class vararg_varnode (line 9423) | class vararg_varnode : public expression_node<T>
method vararg_varnode (line 9431) | vararg_varnode(const Sequence<expression_ptr,Allocator>& arg_list)
method T (line 9450) | inline T value() const
method type (line 9458) | inline typename expression_node<T>::node_type type() const
class vectorize_node (line 9469) | class vectorize_node : public expression_node<T>
method vectorize_node (line 9475) | vectorize_node(const expression_ptr v)
method T (line 9496) | inline T value() const
method type (line 9507) | inline typename expression_node<T>::node_type type() const
class assignment_node (line 9520) | class assignment_node : public binary_node<T>
method assignment_node (line 9526) | assignment_node(const operator_type& opr,
method T (line 9538) | inline T value() const
class assignment_vec_elem_node (line 9558) | class assignment_vec_elem_node : public binary_node<T>
method assignment_vec_elem_node (line 9564) | assignment_vec_elem_node(const operator_type& opr,
method T (line 9576) | inline T value() const
class assignment_rebasevec_elem_node (line 9596) | class assignment_rebasevec_elem_node : public binary_node<T>
method assignment_rebasevec_elem_node (line 9602) | assignment_rebasevec_elem_node(const operator_type& opr,
method T (line 9614) | inline T value() const
class assignment_rebasevec_celem_node (line 9634) | class assignment_rebasevec_celem_node : public binary_node<T>
method assignment_rebasevec_celem_node (line 9640) | assignment_rebasevec_celem_node(const operator_type& opr,
method T (line 9652) | inline T value() const
class assignment_vec_node (line 9672) | class assignment_vec_node : public binary_node <T>,
method assignment_vec_node (line 9681) | assignment_vec_node(const operator_type& opr,
method T (line 9694) | inline T value() const
method vector_node_ptr (line 9752) | vector_node_ptr vec() const
method vector_node_ptr (line 9757) | vector_node_ptr vec()
method type (line 9762) | inline typename expression_node<T>::node_type type() const
method size (line 9767) | std::size_t size() const
method vds_t (line 9772) | vds_t& vds()
method vds_t (line 9777) | const vds_t& vds() const
class assignment_vecvec_node (line 9789) | class assignment_vecvec_node : public binary_node <T>,
method assignment_vecvec_node (line 9798) | assignment_vecvec_node(const operator_type& opr,
method T (line 9839) | inline T value() const
method vector_node_ptr (line 9902) | vector_node_ptr vec() const
method vector_node_ptr (line 9907) | vector_node_ptr vec()
method type (line 9912) | inline typename expression_node<T>::node_type type() const
method size (line 9917) | std::size_t size() const
method vds_t (line 9922) | vds_t& vds()
method vds_t (line 9927) | const vds_t& vds() const
class assignment_op_node (line 9942) | class assignment_op_node : public binary_node<T>
method assignment_op_node (line 9948) | assignment_op_node(const operator_type& opr,
method T (line 9960) | inline T value() const
class assignment_vec_elem_op_node (line 9979) | class assignment_vec_elem_op_node : public binary_node<T>
method assignment_vec_elem_op_node (line 9985) | assignment_vec_elem_op_node(const operator_type& opr,
method T (line 9997) | inline T value() const
class assignment_rebasevec_elem_op_node (line 10016) | class assignment_rebasevec_elem_op_node : public binary_node<T>
method assignment_rebasevec_elem_op_node (line 10022) | assignment_rebasevec_elem_op_node(const operator_type& opr,
method T (line 10034) | inline T value() const
class assignment_rebasevec_celem_op_node (line 10053) | class assignment_rebasevec_celem_op_node : public binary_node<T>
method assignment_rebasevec_celem_op_node (line 10059) | assignment_rebasevec_celem_op_node(const operator_type& opr,
method T (line 10071) | inline T value() const
class assignment_vec_op_node (line 10090) | class assignment_vec_op_node : public binary_node <T>,
method assignment_vec_op_node (line 10099) | assignment_vec_op_node(const operator_type& opr,
method T (line 10112) | inline T value() const
method vector_node_ptr (line 10171) | vector_node_ptr vec() const
method vector_node_ptr (line 10176) | vector_node_ptr vec()
method type (line 10181) | inline typename expression_node<T>::node_type type() const
method size (line 10186) | std::size_t size() const
method vds_t (line 10191) | vds_t& vds()
method vds_t (line 10196) | const vds_t& vds() const
method side_effect (line 10201) | bool side_effect() const
class assignment_vecvec_op_node (line 10213) | class assignment_vecvec_op_node : public binary_node <T>,
method assignment_vecvec_op_node (line 10222) | assignment_vecvec_op_node(const operator_type& opr,
method T (line 10257) | inline T value() const
method vector_node_ptr (line 10320) | vector_node_ptr vec() const
method vector_node_ptr (line 10325) | vector_node_ptr vec()
method type (line 10330) | inline typename expression_node<T>::node_type type() const
method size (line 10335) | std::size_t size() const
method vds_t (line 10340) | vds_t& vds()
method vds_t (line 10345) | const vds_t& vds() const
method side_effect (line 10350) | bool side_effect() const
class vec_binop_vecvec_node (line 10364) | class vec_binop_vecvec_node : public binary_node <T>,
method vec_binop_vecvec_node (line 10374) | vec_binop_vecvec_node(const operator_type& opr,
method T (line 10442) | inline T value() const
method vector_node_ptr (line 10507) | vector_node_ptr vec() const
method vector_node_ptr (line 10512) | vector_node_ptr vec()
method type (line 10517) | inline typename expression_node<T>::node_type type() const
method size (line 10522) | std::size_t size() const
method vds_t (line 10527) | vds_t& vds()
method vds_t (line 10532) | const vds_t& vds() const
class vec_binop_vecval_node (line 10548) | class vec_binop_vecval_node : public binary_node <T>,
method vec_binop_vecval_node (line 10558) | vec_binop_vecval_node(const operator_type& opr,
method T (line 10601) | inline T value() const
method vector_node_ptr (line 10664) | vector_node_ptr vec() const
method vector_node_ptr (line 10669) | vector_node_ptr vec()
method type (line 10674) | inline typename expression_node<T>::node_type type() const
method size (line 10679) | std::size_t size() const
method vds_t (line 10684) | vds_t& vds()
method vds_t (line 10689) | const vds_t& vds() const
class vec_binop_valvec_node (line 10703) | class vec_binop_valvec_node : public binary_node <T>,
method vec_binop_valvec_node (line 10713) | vec_binop_valvec_node(const operator_type& opr,
method T (line 10756) | inline T value() const
method vector_node_ptr (line 10819) | vector_node_ptr vec() const
method vector_node_ptr (line 10824) | vector_node_ptr vec()
method type (line 10829) | inline typename expression_node<T>::node_type type() const
method size (line 10834) | std::size_t size() const
method vds_t (line 10839) | vds_t& vds()
method vds_t (line 10844) | const vds_t& vds() const
class unary_vector_node (line 10858) | class unary_vector_node : public unary_node <T>,
method unary_vector_node (line 10868) | unary_vector_node(const operator_type& opr, expression_ptr branch0)
method T (line 10909) | inline T value() const
method vector_node_ptr (line 10971) | vector_node_ptr vec() const
method vector_node_ptr (line 10976) | vector_node_ptr vec()
method type (line 10981) | inline typename expression_node<T>::node_type type() const
method size (line 10986) | std::size_t size() const
method vds_t (line 10991) | vds_t& vds()
method vds_t (line 10996) | const vds_t& vds() const
class scand_node (line 11010) | class scand_node : public binary_node<T>
method scand_node (line 11016) | scand_node(const operator_type& opr,
method T (line 11022) | inline T value() const
class scor_node (line 11034) | class scor_node : public binary_node<T>
method scor_node (line 11040) | scor_node(const operator_type& opr,
method T (line 11046) | inline T value() const
class function_N_node (line 11058) | class function_N_node : public expression_node<T>
method function_N_node (line 11067) | function_N_node(ifunction* func)
method init_branches (line 11078) | bool init_branches(expression_ptr (&b)[NumBranches])
method T (line 11108) | inline T value() const
type evaluate_branches (line 11129) | struct evaluate_branches
method execute (line 11131) | static inline void execute(T_ (&v)[BranchCount], const branch_t (&...
type evaluate_branches <T_,5> (line 11141) | struct evaluate_branches <T_,5>
method execute (line 11143) | static inline void execute(T_ (&v)[5], const branch_t (&b)[5])
type evaluate_branches <T_,4> (line 11154) | struct evaluate_branches <T_,4>
method execute (line 11156) | static inline void execute(T_ (&v)[4], const branch_t (&b)[4])
type evaluate_branches <T_,3> (line 11166) | struct evaluate_branches <T_,3>
method execute (line 11168) | static inline void execute(T_ (&v)[3], const branch_t (&b)[3])
type evaluate_branches <T_,2> (line 11177) | struct evaluate_branches <T_,2>
method execute (line 11179) | static inline void execute(T_ (&v)[2], const branch_t (&b)[2])
type evaluate_branches <T_,1> (line 11187) | struct evaluate_branches <T_,1>
method execute (line 11189) | static inline void execute(T_ (&v)[1], const branch_t (&b)[1])
type invoke (line 11196) | struct invoke { static inline T execute(ifunction&, branch_t (&)[Par...
method T (line 11196) | static inline T execute(ifunction&, branch_t (&)[ParamCount]) { re...
type invoke<T_,20> (line 11199) | struct invoke<T_,20>
method T_ (line 11201) | static inline T_ execute(ifunction& f, T_ (&v)[20])
type invoke<T_,19> (line 11206) | struct invoke<T_,19>
method T_ (line 11208) | static inline T_ execute(ifunction& f, T_ (&v)[19])
type invoke<T_,18> (line 11213) | struct invoke<T_,18>
method T_ (line 11215) | static inline T_ execute(ifunction& f, T_ (&v)[18])
type invoke<T_,17> (line 11220) | struct invoke<T_,17>
method T_ (line 11222) | static inline T_ execute(ifunction& f, T_ (&v)[17])
type invoke<T_,16> (line 11227) | struct invoke<T_,16>
method T_ (line 11229) | static inline T_ execute(ifunction& f, T_ (&v)[16])
type invoke<T_,15> (line 11234) | struct invoke<T_,15>
method T_ (line 11236) | static inline T_ execute(ifunction& f, T_ (&v)[15])
type invoke<T_,14> (line 11241) | struct invoke<T_,14>
method T_ (line 11243) | static inline T_ execute(ifunction& f, T_ (&v)[14])
type invoke<T_,13> (line 11248) | struct invoke<T_,13>
method T_ (line 11250) | static inline T_ execute(ifunction& f, T_ (&v)[13])
type invoke<T_,12> (line 11255) | struct invoke<T_,12>
method T_ (line 11257) | static inline T_ execute(ifunction& f, T_ (&v)[12])
type invoke<T_,11> (line 11262) | struct invoke<T_,11>
method T_ (line 11264) | static inline T_ execute(ifunction& f, T_ (&v)[11])
type invoke<T_,10> (line 11269) | struct invoke<T_,10>
method T_ (line 11271) | static inline T_ execute(ifunction& f, T_ (&v)[10])
type invoke<T_,9> (line 11276) | struct invoke<T_,9>
method T_ (line 11278) | static inline T_ execute(ifunction& f, T_ (&v)[9])
type invoke<T_,8> (line 11283) | struct invoke<T_,8>
method T_ (line 11285) | static inline T_ execute(ifunction& f, T_ (&v)[8])
type invoke<T_,7> (line 11290) | struct invoke<T_,7>
method T_ (line 11292) | static inline T_ execute(ifunction& f, T_ (&v)[7])
type invoke<T_,6> (line 11297) | struct invoke<T_,6>
method T_ (line 11299) | static inline T_ execute(ifunction& f, T_ (&v)[6])
type invoke<T_,5> (line 11304) | struct invoke<T_,5>
method T_ (line 11306) | static inline T_ execute(ifunction& f, T_ (&v)[5])
type invoke<T_,4> (line 11311) | struct invoke<T_,4>
method T_ (line 11313) | static inline T_ execute(ifunction& f, T_ (&v)[4])
type invoke<T_,3> (line 11318) | struct invoke<T_,3>
method T_ (line 11320) | static inline T_ execute(ifunction& f, T_ (&v)[3])
type invoke<T_,2> (line 11325) | struct invoke<T_,2>
method T_ (line 11327) | static inline T_ execute(ifunction& f, T_ (&v)[2])
type invoke<T_,1> (line 11332) | struct invoke<T_,1>
method T_ (line 11334) | static inline T_ execute(ifunction& f, T_ (&v)[1])
method type (line 11338) | inline typename expression_node<T>::node_type type() const
class function_N_node<T,IFunction,0> (line 11351) | class function_N_node<T,IFunction,0> : public expression_node<T>
method function_N_node (line 11358) | function_N_node(ifunction* func)
method T (line 11367) | inline T value() const
method type (line 11375) | inline typename expression_node<T>::node_type type() const
class vararg_function_node (line 11386) | class vararg_function_node : public expression_node<T>
method vararg_function_node (line 11392) | vararg_function_node(VarArgFunction* func,
method T (line 11416) | inline T value() const
method type (line 11427) | inline typename expression_node<T>::node_type type() const
method populate_value_list (line 11434) | inline void populate_value_list() const
class generic_function_node (line 11448) | class generic_function_node : public expression_node<T>
method generic_function_node (line 11467) | generic_function_node(const std::vector<expression_ptr>& arg_list,
method init_branches (line 11478) | virtual bool init_branches()
function T (line 11568) | inline T value() const
function type (line 11583) | inline typename expression_node<T>::node_type type() const
function disable_type_checking (line 18147) | inline void disable_type_checking(Parser& p)
class results_context (line 4375) | class results_context
method results_context (line 4381) | results_context()
method count (line 4385) | inline std::size_t count() const
method type_store_t (line 4393) | inline type_store_t& operator[](const std::size_t& index)
method type_store_t (line 4398) | inline const type_store_t& operator[](const std::size_t& index) const
method clear (line 4405) | inline void clear()
method assign (line 4413) | inline void assign(const parameter_list_t& pl)
type details (line 4428) | namespace details
class return_node (line 4369) | class return_node
class return_envelope_node (line 4370) | class return_envelope_node
type operator_type (line 4430) | enum operator_type
function to_str (line 4502) | inline std::string to_str(const operator_type opr)
type base_operation_t (line 4530) | struct base_operation_t
method base_operation_t (line 4532) | base_operation_t(const operator_type t, const unsigned int& np)
type loop_unroll (line 4541) | namespace loop_unroll
type details (line 4549) | struct details
method details (line 4551) | details(const std::size_t& vsize,
function dump_ptr (line 4565) | inline void dump_ptr(const std::string& s, const void* ptr, const std:...
function dump_ptr (line 4576) | inline void dump_ptr(const std::string&, const void*) {}
function dump_ptr (line 4577) | inline void dump_ptr(const std::string&, const void*, const std::size_...
class vec_data_store (line 4581) | class vec_data_store
type control_block (line 4590) | struct control_block
method control_block (line 4592) | control_block()
method control_block (line 4599) | control_block(const std::size_t& dsize)
method control_block (line 4606) | control_block(const std::size_t& dsize, data_t dptr, bool dstrct =...
method control_block (line 4623) | static inline control_block* create(const std::size_t& dsize, data...
method destroy (line 4636) | static inline void destroy(control_block*& cntrl_blck)
method create_data (line 4662) | inline void create_data()
method vec_data_store (line 4673) | vec_data_store()
method vec_data_store (line 4677) | vec_data_store(const std::size_t& size)
method vec_data_store (line 4681) | vec_data_store(const std::size_t& size, data_t data, bool dstrct = f...
method vec_data_store (line 4685) | vec_data_store(const type& vds)
method type (line 4696) | type& operator=(const type& vds)
method data_t (line 4717) | inline data_t data()
method data_t (line 4722) | inline data_t data() const
method size (line 4727) | inline std::size_t size()
method size (line 4732) | inline std::size_t size() const
method data_t (line 4737) | inline data_t& ref()
method dump (line 4742) | inline void dump() const
method match_sizes (line 4761) | static inline void match_sizes(type& vds0, type& vds1)
method min_size (line 4770) | static inline std::size_t min_size(control_block* cb0, control_block...
type numeric (line 4784) | namespace numeric
type details (line 4786) | namespace details
function T (line 4789) | inline T process_impl(const operator_type operation, const T arg)
function T (line 4840) | inline T process_impl(const operator_type operation, const T arg0,...
function T (line 4880) | inline T process_impl(const operator_type operation, const T arg0,...
function T (line 4919) | inline T process(const operator_type operation, const T arg)
function T (line 4925) | inline T process(const operator_type operation, const T arg0, const ...
class expression_node (line 4932) | class expression_node
type node_type (line 4936) | enum node_type
method T (line 4983) | inline virtual T value() const
method node_type (line 4993) | inline virtual node_type type() const
function is_true (line 5002) | inline bool is_true(const double v)
function is_true (line 5007) | inline bool is_true(const long double v)
function is_true (line 5012) | inline bool is_true(const float v)
function is_true (line 5018) | inline bool is_true(const std::complex<T>& v)
function is_true (line 5024) | inline bool is_true(const expression_node<T>* node)
function is_false (line 5030) | inline bool is_false(const expression_node<T>* node)
function is_unary_node (line 5036) | inline bool is_unary_node(const expression_node<T>* node)
function is_neg_unary_node (line 5042) | inline bool is_neg_unary_node(const expression_node<T>* node)
function is_binary_node (line 5048) | inline bool is_binary_node(const expression_node<T>* node)
function is_variable_node (line 5054) | inline bool is_variable_node(const expression_node<T>* node)
function is_ivariable_node (line 5060) | inline bool is_ivariable_node(const expression_node<T>* node)
function is_vector_elem_node (line 5072) | inline bool is_vector_elem_node(const expression_node<T>* node)
function is_rebasevector_elem_node (line 5078) | inline bool is_rebasevector_elem_node(const expression_node<T>* node)
function is_rebasevector_celem_node (line 5084) | inline bool is_rebasevector_celem_node(const expression_node<T>* node)
function is_vector_node (line 5090) | inline bool is_vector_node(const expression_node<T>* node)
function is_ivector_node (line 5096) | inline bool is_ivector_node(const expression_node<T>* node)
function is_constant_node (line 5120) | inline bool is_constant_node(const expression_node<T>* node)
function is_null_node (line 5126) | inline bool is_null_node(const expression_node<T>* node)
function is_break_node (line 5132) | inline bool is_break_node(const expression_node<T>* node)
function is_continue_node (line 5138) | inline bool is_continue_node(const expression_node<T>* node)
function is_swap_node (line 5144) | inline bool is_swap_node(const expression_node<T>* node)
function is_function (line 5150) | inline bool is_function(const expression_node<T>* node)
function is_return_node (line 5156) | inline bool is_return_node(const expression_node<T>* node)
class unary_node (line 5161) | class unary_node
method unary_node (line 5694) | unary_node(const operator_type& opr,
method T (line 5709) | inline T value() const
method type (line 5716) | inline typename expression_node<T>::node_type type() const
method operator_type (line 5721) | inline operator_type operation() const
method release (line 5731) | inline void release()
function is_negate_node (line 5164) | inline bool is_negate_node(const expression_node<T>* node)
function branch_deletable (line 5175) | inline bool branch_deletable(expression_node<T>* node)
function all_nodes_valid (line 5182) | inline bool all_nodes_valid(expression_node<T>* (&b)[N])
function all_nodes_valid (line 5195) | inline bool all_nodes_valid(const Sequence<expression_node<T>*,Allocat...
function all_nodes_variables (line 5206) | inline bool all_nodes_variables(expression_node<T>* (&b)[N])
function all_nodes_variables (line 5222) | inline bool all_nodes_variables(Sequence<expression_node<T>*,Allocator...
function free_all_nodes (line 5236) | inline void free_all_nodes(NodeAllocator& node_allocator, expression_n...
function free_all_nodes (line 5248) | inline void free_all_nodes(NodeAllocator& node_allocator, Sequence<exp...
function free_node (line 5259) | inline void free_node(NodeAllocator& node_allocator, expression_node<T...
function destroy_node (line 5275) | inline void destroy_node(expression_node<T>*& node)
class vector_holder (line 5282) | class vector_holder
class vector_holder_base (line 5290) | class vector_holder_base
method value_ptr (line 5296) | inline value_ptr operator[](const std::size_t& index) const
method size (line 5301) | inline std::size_t size() const
method value_ptr (line 5306) | inline value_ptr data() const
method rebaseable (line 5311) | virtual inline bool rebaseable() const
method set_ref (line 5316) | virtual void set_ref(value_ptr*) {}
class array_vector_impl (line 5324) | class array_vector_impl : public vector_holder_base
method array_vector_impl (line 5328) | array_vector_impl(const Type* vec, const std::size_t& vec_size)
method value_ptr (line 5335) | value_ptr value_at(const std::size_t& index) const
method vector_size (line 5343) | std::size_t vector_size() const
class sequence_vector_impl (line 5358) | class sequence_vector_impl : public vector_holder_base
method sequence_vector_impl (line 5364) | sequence_vector_impl(sequence_t& seq)
method value_ptr (line 5370) | value_ptr value_at(const std::size_t& index) const
method vector_size (line 5375) | std::size_t vector_size() const
class vector_view_impl (line 5387) | class vector_view_impl : public vector_holder_base
method vector_view_impl (line 5393) | vector_view_impl(vector_view_t& vec_view)
method set_ref (line 5397) | void set_ref(value_ptr* ref)
method rebaseable (line 5402) | virtual inline bool rebaseable() const
method value_ptr (line 5409) | value_ptr value_at(const std::size_t& index) const
method vector_size (line 5414) | std::size_t vector_size() const
method vector_holder (line 5430) | vector_holder(Type* vec, const std::size_t& vec_size)
method vector_holder (line 5434) | vector_holder(const vds_t& vds)
method vector_holder (line 5439) | vector_holder(std::vector<Type,Allocator>& vec)
method vector_holder (line 5443) | vector_holder(exprtk::vector_view<Type>& vec)
method value_ptr (line 5447) | inline value_ptr operator[](const std::size_t& index) const
method size (line 5452) | inline std::size_t size() const
method value_ptr (line 5457) | inline value_ptr data() const
method set_ref (line 5462) | void set_ref(value_ptr* ref)
method rebaseable (line 5467) | bool rebaseable() const
class null_node (line 5479) | class null_node : public expression_node<T>
method T (line 5483) | inline T value() const
method type (line 5488) | inline typename expression_node<T>::node_type type() const
class null_eq_node (line 5495) | class null_eq_node : public expression_node<T>
method null_eq_node (line 5501) | null_eq_node(expression_ptr brnch, const bool equality = true)
method T (line 5515) | inline T value() const
method type (line 5526) | inline typename expression_node<T>::node_type type() const
method operator_type (line 5531) | inline operator_type operation() const
class literal_node (line 5549) | class literal_node : public expression_node<T>
method literal_node (line 5553) | explicit literal_node(const T& v)
method T (line 5557) | inline T value() const
method type (line 5562) | inline typename expression_node<T>::node_type type() const
method literal_node (line 5574) | literal_node(literal_node<T>&) {}
type range_pack (line 5581) | struct range_pack
method range_pack (line 6869) | range_pack()
method clear (line 6877) | void clear()
method free (line 6886) | void free()
method const_range (line 6915) | bool const_range()
method var_range (line 6921) | bool var_range()
method const_size (line 6971) | inline std::size_t const_size() const
method cache_size (line 6976) | inline std::size_t cache_size() const
type range_data_type (line 5584) | struct range_data_type
method range_data_type (line 6997) | range_data_type()
class range_interface (line 5587) | class range_interface
class string_base_node (line 5603) | class string_base_node
class string_literal_node (line 5620) | class string_literal_node : public expression_node <T>,
method string_literal_node (line 5628) | explicit string_literal_node(const std::string& v)
method T (line 5637) | inline T value() const
method type (line 5642) | inline typename expression_node<T>::node_type type() const
method str (line 5652) | std::string str() const
method char_cptr (line 5657) | char_cptr base() const
method size (line 5662) | std::size_t size() const
method range_t (line 5667) | range_t& range_ref()
method range_t (line 5672) | const range_t& range_ref() const
class unary_node (line 5688) | class unary_node : public expression_node<T>
method unary_node (line 5694) | unary_node(const operator_type& opr,
method T (line 5709) | inline T value() const
method type (line 5716) | inline typename expression_node<T>::node_type type() const
method operator_type (line 5721) | inline operator_type operation() const
method release (line 5731) | inline void release()
type construct_branch_pair (line 5744) | struct construct_branch_pair
method process (line 5747) | static inline void process(std::pair<expression_node<T>*,bool> (&)[N...
type construct_branch_pair<T,D,true> (line 5752) | struct construct_branch_pair<T,D,true>
method process (line 5755) | static inline void process(std::pair<expression_node<T>*,bool> (&bra...
function init_branches (line 5765) | inline void init_branches(std::pair<expression_node<T>*,bool> (&branch...
type cleanup_branches (line 5789) | struct cleanup_branches
method execute (line 5792) | static inline void execute(std::pair<expression_node<T>*,bool> (&bra...
method execute (line 5806) | static inline void execute(Sequence<std::pair<expression_node<T>*,bo...
class binary_node (line 5819) | class binary_node : public expression_node<T>
method binary_node (line 5826) | binary_node(const operator_type& opr,
method T (line 5839) | inline T value() const
method type (line 5847) | inline typename expression_node<T>::node_type type() const
method operator_type (line 5852) | inline operator_type operation()
class binary_ext_node (line 5874) | class binary_ext_node : public expression_node<T>
method binary_ext_node (line 5881) | binary_ext_node(expression_ptr branch0, expression_ptr branch1)
method T (line 5891) | inline T value() const
method type (line 5899) | inline typename expression_node<T>::node_type type() const
method operator_type (line 5904) | inline operator_type operation()
class trinary_node (line 5925) | class trinary_node : public expression_node<T>
method trinary_node (line 5932) | trinary_node(const operator_type& opr,
method T (line 5946) | inline T value() const
method type (line 5968) | inline typename expression_node<T>::node_type type() const
class quaternary_node (line 5980) | class quaternary_node : public expression_node<T>
method quaternary_node (line 5987) | quaternary_node(const operator_type& opr,
method T (line 6002) | inline T value() const
method type (line 6007) | inline typename expression_node<T>::node_type type() const
class conditional_node (line 6019) | class conditional_node : public expression_node<T>
method conditional_node (line 6025) | conditional_node(expression_ptr test,
method T (line 6054) | inline T value() const
method type (line 6062) | inline typename expression_node<T>::node_type type() const
class cons_conditional_node (line 6078) | class cons_conditional_node : public expression_node<T>
method cons_conditional_node (line 6085) | cons_conditional_node(expression_ptr test,
method T (line 6106) | inline T value() const
method type (line 6114) | inline typename expression_node<T>::node_type type() const
class break_exception (line 6129) | class break_exception
method break_exception (line 6133) | break_exception(const T& v)
class continue_exception (line 6140) | class continue_exception
class break_node (line 6144) | class break_node : public expression_node<T>
method break_node (line 6150) | break_node(expression_ptr ret = expression_ptr(0))
method T (line 6163) | inline T value() const
method type (line 6171) | inline typename expression_node<T>::node_type type() const
class continue_node (line 6183) | class continue_node : public expression_node<T>
method T (line 6187) | inline T value() const
method type (line 6195) | inline typename expression_node<T>::node_type type() const
class while_loop_node (line 6203) | class while_loop_node : public expression_node<T>
method while_loop_node (line 6209) | while_loop_node(expression_ptr condition, expression_ptr loop_body)
method T (line 6229) | inline T value() const
method type (line 6241) | inline typename expression_node<T>::node_type type() const
class repeat_until_loop_node (line 6255) | class repeat_until_loop_node : public expression_node<T>
method repeat_until_loop_node (line 6261) | repeat_until_loop_node(expression_ptr condition, expression_ptr loop...
method T (line 6281) | inline T value() const
method type (line 6294) | inline typename expression_node<T>::node_type type() const
class for_loop_node (line 6308) | class for_loop_node : public expression_node<T>
method for_loop_node (line 6314) | for_loop_node(expression_ptr initialiser,
method T (line 6351) | inline T value() const
method type (line 6377) | inline typename expression_node<T>::node_type type() const
class while_loop_bc_node (line 6396) | class while_loop_bc_node : public expression_node<T>
method while_loop_bc_node (line 6402) | while_loop_bc_node(expression_ptr condition, expression_ptr loop_body)
method T (line 6422) | inline T value() const
method type (line 6443) | inline typename expression_node<T>::node_type type() const
class repeat_until_loop_bc_node (line 6457) | class repeat_until_loop_bc_node : public expression_node<T>
method repeat_until_loop_bc_node (line 6463) | repeat_until_loop_bc_node(expression_ptr condition, expression_ptr l...
method T (line 6483) | inline T value() const
method type (line 6505) | inline typename expression_node<T>::node_type type() const
class for_loop_bc_node (line 6519) | class for_loop_bc_node : public expression_node<T>
method for_loop_bc_node (line 6525) | for_loop_bc_node(expression_ptr initialiser,
method T (line 6562) | inline T value() const
method type (line 6607) | inline typename expression_node<T>::node_type type() const
class switch_node (line 6626) | class switch_node : public expression_node<T>
method switch_node (line 6634) | switch_node(const Sequence<expression_ptr,Allocator>& arg_list)
method T (line 6669) | inline T value() const
method type (line 6692) | inline typename expression_node<T>::node_type type() const
class switch_n_node (line 6704) | class switch_n_node : public switch_node<T>
method switch_n_node (line 6712) | switch_n_node(const Sequence<expression_ptr,Allocator>& arg_list)
method T (line 6716) | inline T value() const
class multi_switch_node (line 6723) | class multi_switch_node : public expression_node<T>
method multi_switch_node (line 6731) | multi_switch_node(const Sequence<expression_ptr,Allocator>& arg_list)
method T (line 6766) | inline T value() const
method type (line 6791) | inline typename expression_node<T>::node_type type() const
class ivariable (line 6803) | class ivariable
class variable_node (line 6815) | class variable_node : public expression_node<T>,
method variable_node (line 6822) | explicit variable_node()
method variable_node (line 6826) | variable_node(T& v)
method T (line 6835) | inline T value() const
method T (line 6840) | inline T& ref()
method T (line 6845) | inline const T& ref() const
method type (line 6850) | inline typename expression_node<T>::node_type type() const
type range_pack (line 6864) | struct range_pack
method range_pack (line 6869) | range_pack()
method clear (line 6877) | void clear()
method free (line 6886) | void free()
method const_range (line 6915) | bool const_range()
method var_range (line 6921) | bool var_range()
method const_size (line 6971) | inline std::size_t const_size() const
method cache_size (line 6976) | inline std::size_t cache_size() const
class string_base_node (line 6989) | class string_base_node
type range_data_type (line 6992) | struct range_data_type
method range_data_type (line 6997) | range_data_type()
class vector_node (line 7012) | class vector_node
method vector_node (line 7049) | vector_node(vector_holder_t* vh)
method vector_node (line 7056) | vector_node(const vds_t& vds, vector_holder_t* vh)
method T (line 7061) | inline T value() const
method vector_node_ptr (line 7066) | vector_node_ptr vec() const
method vector_node_ptr (line 7071) | vector_node_ptr vec()
method type (line 7076) | inline typename expression_node<T>::node_type type() const
method size (line 7081) | std::size_t size() const
method vds_t (line 7086) | vds_t& vds()
method vds_t (line 7091) | const vds_t& vds() const
method vector_holder_t (line 7096) | inline vector_holder_t& vec_holder()
class vector_interface (line 7015) | class vector_interface
method side_effect (line 7035) | virtual bool side_effect () const { return false; }
class vector_node (line 7039) | class vector_node : public expression_node <T>,
method vector_node (line 7049) | vector_node(vector_holder_t* vh)
method vector_node (line 7056) | vector_node(const vds_t& vds, vector_holder_t* vh)
method T (line 7061) | inline T value() const
method vector_node_ptr (line 7066) | vector_node_ptr vec() const
method vector_node_ptr (line 7071) | vector_node_ptr vec()
method type (line 7076) | inline typename expression_node<T>::node_type type() const
method size (line 7081) | std::size_t size() const
method vds_t (line 7086) | vds_t& vds()
method vds_t (line 7091) | const vds_t& vds() const
method vector_holder_t (line 7096) | inline vector_holder_t& vec_holder()
class vector_elem_node (line 7108) | class vector_elem_node : public expression_node<T>,
method vector_elem_node (line 7117) | vector_elem_node(expression_ptr index, vector_holder_ptr vec_holder)
method T (line 7132) | inline T value() const
method T (line 7137) | inline T& ref()
method T (line 7142) | inline const T& ref() const
method type (line 7147) | inline typename expression_node<T>::node_type type() const
method vector_holder_t (line 7152) | inline vector_holder_t& vec_holder()
class rebasevector_elem_node (line 7166) | class rebasevector_elem_node : public expression_node<T>,
method rebasevector_elem_node (line 7176) | rebasevector_elem_node(expression_ptr index, vector_holder_ptr vec_h...
method T (line 7193) | inline T value() const
method T (line 7198) | inline T& ref()
method T (line 7203) | inline const T& ref() const
method type (line 7208) | inline typename expression_node<T>::node_type type() const
method vector_holder_t (line 7213) | inline vector_holder_t& vec_holder()
class rebasevector_celem_node (line 7227) | class rebasevector_celem_node : public expression_node<T>,
method rebasevector_celem_node (line 7237) | rebasevector_celem_node(const std::size_t index, vector_holder_ptr v...
method T (line 7245) | inline T value() const
method T (line 7250) | inline T& ref()
method T (line 7255) | inline const T& ref() const
method type (line 7260) | inline typename expression_node<T>::node_type type() const
method vector_holder_t (line 7265) | inline vector_holder_t& vec_holder()
class vector_assignment_node (line 7278) | class vector_assignment_node : public expression_node<T>
method vector_assignment_node (line 7284) | vector_assignment_node(T* vector_base,
method T (line 7305) | inline T value() const
method type (line 7335) | inline typename expression_node<T>::node_type type() const
class swap_node (line 7351) | class swap_node : public expression_node<T>
method swap_node (line 7358) | swap_node(variable_node_ptr var0, variable_node_ptr var1)
method T (line 7363) | inline T value() const
method type (line 7369) | inline typename expression_node<T>::node_type type() const
class swap_generic_node (line 7381) | class swap_generic_node : public binary_node<T>
method swap_generic_node (line 7388) | swap_generic_node(expression_ptr var0, expression_ptr var1)
method T (line 7394) | inline T value() const
method type (line 7400) | inline typename expression_node<T>::node_type type() const
class swap_vecvec_node (line 7412) | class swap_vecvec_node : public binary_node <T>,
method swap_vecvec_node (line 7421) | swap_vecvec_node(expression_ptr branch0,
method T (line 7459) | inline T value() const
method vector_node_ptr (line 7480) | vector_node_ptr vec() const
method vector_node_ptr (line 7485) | vector_node_ptr vec()
method type (line 7490) | inline typename expression_node<T>::node_type type() const
method size (line 7495) | std::size_t size() const
method vds_t (line 7500) | vds_t& vds()
method vds_t (line 7505) | const vds_t& vds() const
class stringvar_node (line 7521) | class stringvar_node : public expression_node <T>,
method stringvar_node (line 7531) | explicit stringvar_node()
method stringvar_node (line 7535) | explicit stringvar_node(std::string& v)
method T (line 7549) | inline T value() const
method str (line 7557) | std::string str() const
method char_cptr (line 7562) | char_cptr base() const
method size (line 7567) | std::size_t size() const
method range_t (line 7582) | range_t& range_ref()
method range_t (line 7587) | const range_t& range_ref() const
method type (line 7592) | inline typename expression_node<T>::node_type type() const
class string_range_node (line 7607) | class string_range_node : public expression_node <T>,
method string_range_node (line 7617) | explicit string_range_node(std::string& v, const range_t& rp)
method T (line 7632) | inline T value() const
method str (line 7637) | inline std::string str() const
method char_cptr (line 7642) | char_cptr base() const
method size (line 7647) | std::size_t size() const
method range_t (line 7652) | inline range_t range() const
method range_t (line 7667) | inline range_t& range_ref()
method range_t (line 7672) | inline const range_t& range_ref() const
method type (line 7677) | inline typename expression_node<T>::node_type type() const
class const_string_range_node (line 7692) | class const_string_range_node : public expression_node <T>,
method const_string_range_node (line 7700) | explicit const_string_range_node(const std::string& v, const range_t...
method T (line 7710) | inline T value() const
method str (line 7715) | std::string str() const
method char_cptr (line 7720) | char_cptr base() const
method size (line 7725) | std::size_t size() const
method range_t (line 7730) | range_t range() const
method range_t (line 7735) | range_t& range_ref()
method range_t (line 7740) | const range_t& range_ref() const
method type (line 7745) | inline typename expression_node<T>::node_type type() const
class generic_string_range_node (line 7759) | class generic_string_range_node : public expression_node <T>,
method generic_string_range_node (line 7773) | generic_string_range_node(expression_ptr str_branch, const range_t& ...
method T (line 7812) | inline T value() const
method str (line 7845) | std::string str() const
method char_cptr (line 7850) | char_cptr base() const
method size (line 7855) | std::size_t size() const
method range_t (line 7860) | range_t& range_ref()
method range_t (line 7865) | const range_t& range_ref() const
method type (line 7870) | inline typename expression_node<T>::node_type type() const
class string_concat_node (line 7888) | class string_concat_node : public binary_node <T>,
method string_concat_node (line 7901) | string_concat_node(const operator_type& opr,
method T (line 7949) | inline T value() const
method str (line 7984) | std::string str() const
method char_cptr (line 7989) | char_cptr base() const
method size (line 7994) | std::size_t size() const
method range_t (line 7999) | range_t& range_ref()
method range_t (line 8004) | const range_t& range_ref() const
method type (line 8009) | inline typename expression_node<T>::node_type type() const
class swap_string_node (line 8026) | class swap_string_node : public binary_node <T>,
method swap_string_node (line 8040) | swap_string_node(expression_ptr branch0, expression_ptr branch1)
method T (line 8059) | inline T value() const
method str (line 8072) | std::string str() const
method char_cptr (line 8077) | char_cptr base() const
method size (line 8082) | std::size_t size() const
method range_t (line 8087) | range_t& range_ref()
method range_t (line 8092) | const range_t& range_ref() const
method type (line 8097) | inline typename expression_node<T>::node_type type() const
class swap_genstrings_node (line 8110) | class swap_genstrings_node : public binary_node<T>
method swap_genstrings_node (line 8121) | swap_genstrings_node(expression_ptr branch0,
method T (line 8166) | inline T value() const
method type (line 8246) | inline typename expression_node<T>::node_type type() const
class stringvar_size_node (line 8264) | class stringvar_size_node : public expression_node<T>
method stringvar_size_node (line 8270) | explicit stringvar_size_node()
method stringvar_size_node (line 8274) | explicit stringvar_size_node(std::string& v)
method T (line 8278) | inline T value() const
method type (line 8283) | inline typename expression_node<T>::node_type type() const
class string_size_node (line 8297) | class string_size_node : public expression_node<T>
method string_size_node (line 8304) | string_size_node(expression_ptr brnch)
method T (line 8326) | inline T value() const
method type (line 8339) | inline typename expression_node<T>::node_type type() const
type asn_assignment (line 8351) | struct asn_assignment
method execute (line 8353) | static inline void execute(std::string& s, char_cptr data, const std...
type asn_addassignment (line 8357) | struct asn_addassignment
method execute (line 8359) | static inline void execute(std::string& s, char_cptr data, const std...
class assignment_string_node (line 8364) | class assignment_string_node : public binary_node <T>,
method assignment_string_node (line 8378) | assignment_string_node(const operator_type& opr,
method T (line 8416) | inline T value() const
method str (line 8440) | std::string str() const
method char_cptr (line 8445) | char_cptr base() const
method size (line 8450) | std::size_t size() const
method range_t (line 8455) | range_t& range_ref()
method range_t (line 8460) | const range_t& range_ref() const
method type (line 8465) | inline typename expression_node<T>::node_type type() const
class assignment_string_range_node (line 8480) | class assignment_string_range_node : public binary_node <T>,
method assignment_string_range_node (line 8494) | assignment_string_range_node(const operator_type& opr,
method T (line 8541) | inline T value() const
method str (line 8573) | std::string str() const
method char_cptr (line 8578) | char_cptr base() const
method size (line 8583) | std::size_t size() const
method range_t (line 8588) | range_t& range_ref()
method range_t (line 8593) | const range_t& range_ref() const
method type (line 8598) | inline typename expression_node<T>::node_type type() const
class conditional_string_node (line 8614) | class conditional_string_node : public trinary_node <T>,
method conditional_string_node (line 8627) | conditional_string_node(expression_ptr test,
method T (line 8679) | inline T value() const
method str (line 8727) | std::string str() const
method char_cptr (line 8732) | char_cptr base() const
method size (line 8737) | std::size_t size() const
method range_t (line 8742) | range_t& range_ref()
method range_t (line 8747) | const range_t& range_ref() const
method type (line 8752) | inline typename expression_node<T>::node_type type() const
class cons_conditional_str_node (line 8773) | class cons_conditional_str_node : public binary_node <T>,
method cons_conditional_str_node (line 8786) | cons_conditional_str_node(expression_ptr test,
method T (line 8817) | inline T value() const
method str (line 8847) | std::string str() const
method char_cptr (line 8852) | char_cptr base() const
method size (line 8857) | std::size_t size() const
method range_t (line 8862) | range_t& range_ref()
method range_t (line 8867) | const range_t& range_ref() const
method type (line 8872) | inline typename expression_node<T>::node_type type() const
class str_vararg_node (line 8890) | class str_vararg_node : public expression_node <T>,
method str_vararg_node (line 8905) | str_vararg_node(const Sequence<expression_ptr,Allocator>& arg_list)
method T (line 8969) | inline T value() const
method str (line 8981) | std::string str() const
method char_cptr (line 8986) | char_cptr base() const
method size (line 8991) | std::size_t size() const
method range_t (line 8996) | range_t& range_ref()
method range_t (line 9001) | const range_t& range_ref() const
method type (line 9006) | inline typename expression_node<T>::node_type type() const
function T (line 9024) | inline T axn(T a, T x)
function T (line 9031) | inline T axnb(T a, T x, T b)
type sf_base (line 9038) | struct sf_base
class sf3_node (line 9245) | class sf3_node : public trinary_node<T>
method sf3_node (line 9251) | sf3_node(const operator_type& opr,
method T (line 9258) | inline T value() const
class sf4_node (line 9269) | class sf4_node : public quaternary_node<T>
method sf4_node (line 9275) | sf4_node(const operator_type& opr,
method T (line 9283) | inline T value() const
class sf3_var_node (line 9295) | class sf3_var_node : public expression_node<T>
method sf3_var_node (line 9301) | sf3_var_node(const T& v0, const T& v1, const T& v2)
method T (line 9307) | inline T value() const
method type (line 9312) | inline typename expression_node<T>::node_type type() const
class sf4_var_node (line 9328) | class sf4_var_node : public expression_node<T>
method sf4_var_node (line 9334) | sf4_var_node(const T& v0, const T& v1, const T& v2, const T& v3)
method T (line 9341) | inline T value() const
method type (line 9346) | inline typename expression_node<T>::node_type type() const
class vararg_node (line 9363) | class vararg_node : public expression_node<T>
method vararg_node (line 9371) | vararg_node(const Sequence<expression_ptr,Allocator>& arg_list)
method T (line 9403) | inline T value() const
method type (line 9411) | inline typename expression_node<T>::node_type type() const
class vararg_varnode (line 9423) | class vararg_varnode : public expression_node<T>
method vararg_varnode (line 9431) | vararg_varnode(const Sequence<expression_ptr,Allocator>& arg_list)
method T (line 9450) | inline T value() const
method type (line 9458) | inline typename expression_node<T>::node_type type() const
class vectorize_node (line 9469) | class vectorize_node : public expression_node<T>
method vectorize_node (line 9475) | vectorize_node(const expression_ptr v)
method T (line 9496) | inline T value() const
method type (line 9507) | inline typename expression_node<T>::node_type type() const
class assignment_node (line 9520) | class assignment_node : public binary_node<T>
method assignment_node (line 9526) | assignment_node(const operator_type& opr,
method T (line 9538) | inline T value() const
class assignment_vec_elem_node (line 9558) | class assignment_vec_elem_node : public binary_node<T>
method assignment_vec_elem_node (line 9564) | assignment_vec_elem_node(const operator_type& opr,
method T (line 9576) | inline T value() const
class assignment_rebasevec_elem_node (line 9596) | class assignment_rebasevec_elem_node : public binary_node<T>
method assignment_rebasevec_elem_node (line 9602) | assignment_rebasevec_elem_node(const operator_type& opr,
method T (line 9614) | inline T value() const
class assignment_rebasevec_celem_node (line 9634) | class assignment_rebasevec_celem_node : public binary_node<T>
method assignment_rebasevec_celem_node (line 9640) | assignment_rebasevec_celem_node(const operator_type& opr,
method T (line 9652) | inline T value() const
class assignment_vec_node (line 9672) | class assignment_vec_node : public binary_node <T>,
method assignment_vec_node (line 9681) | assignment_vec_node(const operator_type& opr,
method T (line 9694) | inline T value() const
method vector_node_ptr (line 9752) | vector_node_ptr vec() const
method vector_node_ptr (line 9757) | vector_node_ptr vec()
method type (line 9762) | inline typename expression_node<T>::node_type type() const
method size (line 9767) | std::size_t size() const
method vds_t (line 9772) | vds_t& vds()
method vds_t (line 9777) | const vds_t& vds() const
class assignment_vecvec_node (line 9789) | class assignment_vecvec_node : public binary_node <T>,
method assignment_vecvec_node (line 9798) | assignment_vecvec_node(const operator_type& opr,
method T (line 9839) | inline T value() const
method vector_node_ptr (line 9902) | vector_node_ptr vec() const
method vector_node_ptr (line 9907) | vector_node_ptr vec()
method type (line 9912) | inline typename expression_node<T>::node_type type() const
method size (line 9917) | std::size_t size() const
method vds_t (line 9922) | vds_t& vds()
method vds_t (line 9927) | const vds_t& vds() const
class assignment_op_node (line 9942) | class assignment_op_node : public binary_node<T>
method assignment_op_node (line 9948) | assignment_op_node(const operator_type& opr,
method T (line 9960) | inline T value() const
class assignment_vec_elem_op_node (line 9979) | class assignment_vec_elem_op_node : public binary_node<T>
method assignment_vec_elem_op_node (line 9985) | assignment_vec_elem_op_node(const operator_type& opr,
method T (line 9997) | inline T value() const
class assignment_rebasevec_elem_op_node (line 10016) | class assignment_rebasevec_elem_op_node : public binary_node<T>
method assignment_rebasevec_elem_op_node (line 10022) | assignment_rebasevec_elem_op_node(const operator_type& opr,
method T (line 10034) | inline T value() const
class assignment_rebasevec_celem_op_node (line 10053) | class assignment_rebasevec_celem_op_node : public binary_node<T>
method assignment_rebasevec_celem_op_node (line 10059) | assignment_rebasevec_celem_op_node(const operator_type& opr,
method T (line 10071) | inline T value() const
class assignment_vec_op_node (line 10090) | class assignment_vec_op_node : public binary_node <T>,
method assignment_vec_op_node (line 10099) | assignment_vec_op_node(const operator_type& opr,
method T (line 10112) | inline T value() const
method vector_node_ptr (line 10171) | vector_node_ptr vec() const
method vector_node_ptr (line 10176) | vector_node_ptr vec()
method type (line 10181) | inline typename expression_node<T>::node_type type() const
method size (line 10186) | std::size_t size() const
method vds_t (line 10191) | vds_t& vds()
method vds_t (line 10196) | const vds_t& vds() const
method side_effect (line 10201) | bool side_effect() const
class assignment_vecvec_op_node (line 10213) | class assignment_vecvec_op_node : public binary_node <T>,
method assignment_vecvec_op_node (line 10222) | assignment_vecvec_op_node(const operator_type& opr,
method T (line 10257) | inline T value() const
method vector_node_ptr (line 10320) | vector_node_ptr vec() const
method vector_node_ptr (line 10325) | vector_node_ptr vec()
method type (line 10330) | inline typename expression_node<T>::node_type type() const
method size (line 10335) | std::size_t size() const
method vds_t (line 10340) | vds_t& vds()
method vds_t (line 10345) | const vds_t& vds() const
method side_effect (line 10350) | bool side_effect() const
class vec_binop_vecvec_node (line 10364) | class vec_binop_vecvec_node : public binary_node <T>,
method vec_binop_vecvec_node (line 10374) | vec_binop_vecvec_node(const operator_type& opr,
method T (line 10442) | inline T value() const
method vector_node_ptr (line 10507) | vector_node_ptr vec() const
method vector_node_ptr (line 10512) | vector_node_ptr vec()
method type (line 10517) | inline typename expression_node<T>::node_type type() const
method size (line 10522) | std::size_t size() const
method vds_t (line 10527) | vds_t& vds()
method vds_t (line 10532) | const vds_t& vds() const
class vec_binop_vecval_node (line 10548) | class vec_binop_vecval_node : public binary_node <T>,
method vec_binop_vecval_node (line 10558) | vec_binop_vecval_node(const operator_type& opr,
method T (line 10601) | inline T value() const
method vector_node_ptr (line 10664) | vector_node_ptr vec() const
method vector_node_ptr (line 10669) | vector_node_ptr vec()
method type (line 10674) | inline typename expression_node<T>::node_type type() const
method size (line 10679) | std::size_t size() const
method vds_t (line 10684) | vds_t& vds()
method vds_t (line 10689) | const vds_t& vds() const
class vec_binop_valvec_node (line 10703) | class vec_binop_valvec_node : public binary_node <T>,
method vec_binop_valvec_node (line 10713) | vec_binop_valvec_node(const operator_type& opr,
method T (line 10756) | inline T value() const
method vector_node_ptr (line 10819) | vector_node_ptr vec() const
method vector_node_ptr (line 10824) | vector_node_ptr vec()
method type (line 10829) | inline typename expression_node<T>::node_type type() const
method size (line 10834) | std::size_t size() const
method vds_t (line 10839) | vds_t& vds()
method vds_t (line 10844) | const vds_t& vds() const
class unary_vector_node (line 10858) | class unary_vector_node : public unary_node <T>,
method unary_vector_node (line 10868) | unary_vector_node(const operator_type& opr, expression_ptr branch0)
method T (line 10909) | inline T value() const
method vector_node_ptr (line 10971) | vector_node_ptr vec() const
method vector_node_ptr (line 10976) | vector_node_ptr vec()
method type (line 10981) | inline typename expression_node<T>::node_type type() const
method size (line 10986) | std::size_t size() const
method vds_t (line 10991) | vds_t& vds()
method vds_t (line 10996) | const vds_t& vds() const
class scand_node (line 11010) | class scand_node : public binary_node<T>
method scand_node (line 11016) | scand_node(const operator_type& opr,
method T (line 11022) | inline T value() const
class scor_node (line 11034) | class scor_node : public binary_node<T>
method scor_node (line 11040) | scor_node(const operator_type& opr,
method T (line 11046) | inline T value() const
class function_N_node (line 11058) | class function_N_node : public expression_node<T>
method function_N_node (line 11067) | function_N_node(ifunction* func)
method init_branches (line 11078) | bool init_branches(expression_ptr (&b)[NumBranches])
method T (line 11108) | inline T value() const
type evaluate_branches (line 11129) | struct evaluate_branches
method execute (line 11131) | static inline void execute(T_ (&v)[BranchCount], const branch_t (&...
type evaluate_branches <T_,5> (line 11141) | struct evaluate_branches <T_,5>
method execute (line 11143) | static inline void execute(T_ (&v)[5], const branch_t (&b)[5])
type evaluate_branches <T_,4> (line 11154) | struct evaluate_branches <T_,4>
method execute (line 11156) | static inline void execute(T_ (&v)[4], const branch_t (&b)[4])
type evaluate_branches <T_,3> (line 11166) | struct evaluate_branches <T_,3>
method execute (line 11168) | static inline void execute(T_ (&v)[3], const branch_t (&b)[3])
type evaluate_branches <T_,2> (line 11177) | struct evaluate_branches <T_,2>
method execute (line 11179) | static inline void execute(T_ (&v)[2], const branch_t (&b)[2])
type evaluate_branches <T_,1> (line 11187) | struct evaluate_branches <T_,1>
method execute (line 11189) | static inline void execute(T_ (&v)[1], const branch_t (&b)[1])
type invoke (line 11196) | struct invoke { static inline T execute(ifunction&, branch_t (&)[Par...
method T (line 11196) | static inline T execute(ifunction&, branch_t (&)[ParamCount]) { re...
type invoke<T_,20> (line 11199) | struct invoke<T_,20>
method T_ (line 11201) | static inline T_ execute(ifunction& f, T_ (&v)[20])
type invoke<T_,19> (line 11206) | struct invoke<T_,19>
method T_ (line 11208) | static inline T_ execute(ifunction& f, T_ (&v)[19])
type invoke<T_,18> (line 11213) | struct invoke<T_,18>
method T_ (line 11215) | static inline T_ execute(ifunction& f, T_ (&v)[18])
type invoke<T_,17> (line 11220) | struct invoke<T_,17>
method T_ (line 11222) | static inline T_ execute(ifunction& f, T_ (&v)[17])
type invoke<T_,16> (line 11227) | struct invoke<T_,16>
method T_ (line 11229) | static inline T_ execute(ifunction& f, T_ (&v)[16])
type invoke<T_,15> (line 11234) | struct invoke<T_,15>
method T_ (line 11236) | static inline T_ execute(ifunction& f, T_ (&v)[15])
type invoke<T_,14> (line 11241) | struct invoke<T_,14>
method T_ (line 11243) | static inline T_ execute(ifunction& f, T_ (&v)[14])
type invoke<T_,13> (line 11248) | struct invoke<T_,13>
method T_ (line 11250) | static inline T_ execute(ifunction& f, T_ (&v)[13])
type invoke<T_,12> (line 11255) | struct invoke<T_,12>
method T_ (line 11257) | static inline T_ execute(ifunction& f, T_ (&v)[12])
type invoke<T_,11> (line 11262) | struct invoke<T_,11>
method T_ (line 11264) | static inline T_ execute(ifunction& f, T_ (&v)[11])
type invoke<T_,10> (line 11269) | struct invoke<T_,10>
method T_ (line 11271) | static inline T_ execute(ifunction& f, T_ (&v)[10])
type invoke<T_,9> (line 11276) | struct invoke<T_,9>
method T_ (line 11278) | static inline T_ execute(ifunction& f, T_ (&v)[9])
type invoke<T_,8> (line 11283) | struct invoke<T_,8>
method T_ (line 11285) | static inline T_ execute(ifunction& f, T_ (&v)[8])
type invoke<T_,7> (line 11290) | struct invoke<T_,7>
method T_ (line 11292) | static inline T_ execute(ifunction& f, T_ (&v)[7])
type invoke<T_,6> (line 11297) | struct invoke<T_,6>
method T_ (line 11299) | static inline T_ execute(ifunction& f, T_ (&v)[6])
type invoke<T_,5> (line 11304) | struct invoke<T_,5>
method T_ (line 11306) | static inline T_ execute(ifunction& f, T_ (&v)[5])
type invoke<T_,4> (line 11311) | struct invoke<T_,4>
method T_ (line 11313) | static inline T_ execute(ifunction& f, T_ (&v)[4])
type invoke<T_,3> (line 11318) | struct invoke<T_,3>
method T_ (line 11320) | static inline T_ execute(ifunction& f, T_ (&v)[3])
type invoke<T_,2> (line 11325) | struct invoke<T_,2>
method T_ (line 11327) | static inline T_ execute(ifunction& f, T_ (&v)[2])
type invoke<T_,1> (line 11332) | struct invoke<T_,1>
method T_ (line 11334) | static inline T_ execute(ifunction& f, T_ (&v)[1])
method type (line 11338) | inline typename expression_node<T>::node_type type() const
class function_N_node<T,IFunction,0> (line 11351) | class function_N_node<T,IFunction,0> : public expression_node<T>
method function_N_node (line 11358) | function_N_node(ifunction* func)
method T (line 11367) | inline T value() const
method type (line 11375) | inline typename expression_node<T>::node_type type() const
class vararg_function_node (line 11386) | class vararg_function_node : public expression_node<T>
method vararg_function_node (line 11392) | vararg_function_node(VarArgFunction* func,
method T (line 11416) | inline T value() const
method type (line 11427) | inline typename expression_node<T>::node_type type() const
method populate_value_list (line 11434) | inline void populate_value_list() const
class generic_function_node (line 11448) | class generic_function_node : public expression_node<T>
method generic_function_node (line 11467) | generic_function_node(const std::vector<expression_ptr>& arg_list,
method init_branches (line 11478) | virtual bool init_branches()
function T (line 11568) | inline T value() const
function type (line 11583) | inline typename expression_node<T>::node_type type() const
function disable_type_checking (line 18147) | inline void disable_type_checking(Parser& p)
class string_function_node (line 11640) | class string_function_node : public generic_function_node<T,StringFuncti...
method string_function_node (line 11649) | string_function_node(StringFunction* func,
method T (line 11664) | inline T value() const
method type (line 11687) | inline typename expression_node<T>::node_type type() const
method str (line 11692) | std::string str() const
method char_cptr (line 11697) | char_cptr base() const
method size (line 11702) | std::size_t size() const
method range_t (line 11707) | range_t& range_ref()
method range_t (line 11712) | const range_t& range_ref() const
class multimode_genfunction_node (line 11725) | class multimode_genfunction_node : public generic_function_node<T,Generi...
method multimode_genfunction_node (line 11732) | multimode_genfunction_node(GenericFunction* func,
method T (line 11739) | inline T value() const
method type (line 11757) | inline typename expression_node<T>::node_type type() const
class multimode_strfunction_node (line 11769) | class multimode_strfunction_node : public string_function_node<T,StringF...
method multimode_strfunction_node (line 11776) | multimode_strfunction_node(StringFunction* func,
method T (line 11783) | inline T value() const
method type (line 11807) | inline typename expression_node<T>::node_type type() const
class return_exception (line 11818) | class return_exception
class null_igenfunc (line 11822) | class null_igenfunc
method T (line 11832) | inline virtual T operator() (parameter_list_t)
class return_node (line 11840) | class return_node : public generic_function_node<T,null_igenfunc<T> >
method return_node (line 11849) | return_node(const std::vector<typename gen_function_t::expression_ptr>...
method T (line 11855) | inline T value() const
method type (line 11873) | inline typename expression_node<T>::node_type type() const
class return_envelope_node (line 11884) | class return_envelope_node : public expression_node<T>
method return_envelope_node (line 11891) | return_envelope_node(expression_ptr body, results_context_t& rc)
method T (line 11906) | inline T value() const
method type (line 11922) | inline typename expression_node<T>::node_type type() const
type opr_base (line 12007) | struct opr_base
type add_op (line 12019) | struct add_op : public opr_base<T>
method T (line 12023) | static inline T process(Type t1, Type t2) { return t1 + t2; }
method T (line 12024) | static inline T process(Type t1, Type t2, Type t3) { return t1 + t2 + ...
method assign (line 12025) | static inline void assign(RefType t1, Type t2) { t1 += t2; }
method type (line 12026) | static inline typename expression_node<T>::node_type type() { return e...
method operation (line 12027) | static inline details::operator_type operation() { return details::e_a...
type mul_op (line 12031) | struct mul_op : public opr_base<T>
method T (line 12035) | static inline T process(Type t1, Type t2) { return t1 * t2; }
method T (line 12036) | static inline T process(Type t1, Type t2, Type t3) { return t1 * t2 * ...
method assign (line 12037) | static inline void assign(RefType t1, Type t2) { t1 *= t2; }
method type (line 12038) | static inline typename expression_node<T>::node_type type() { return e...
method operation (line 12039) | static inline details::operator_type operation() { return details::e_m...
type sub_op (line 12043) | struct sub_op : public opr_base<T>
method T (line 12047) | static inline T process(Type t1, Type t2) { return t1 - t2; }
method T (line 12048) | static inline T process(Type t1, Type t2, Type t3) { return t1 - t2 - ...
method assign (line 12049) | static inline void assign(RefType t1, Type t2) { t1 -= t2; }
method type (line 12050) | static inline typename expression_node<T>::node_type type() { return e...
method operation (line 12051) | static inline details::operator_type operation() { return details::e_s...
type div_op (line 12055) | struct div_op : public opr_base<T>
method T (line 12059) | static inline T process(Type t1, Type t2) { return t1 / t2; }
method T (line 12060) | static inline T process(Type t1, Type t2, Type t3) { return t1 / t2 / ...
method assign (line 12061) | static inline void assign(RefType t1, Type t2) { t1 /= t2; }
method type (line 12062) | static inline typename expression_node<T>::node_type type() { return e...
method operation (line 12063) | static inline details::operator_type operation() { return details::e_d...
type mod_op (line 12067) | struct mod_op : public opr_base<T>
method T (line 12071) | static inline T process(Type t1, Type t2) { return numeric::modulus<T>...
method assign (line 12072) | static inline void assign(RefType t1, Type t2) { t1 = numeric::modulus...
method type (line 12073) | static inline typename expression_node<T>::node_type type() { return e...
method operation (line 12074) | static inline details::operator_type operation() { return details::e_m...
type pow_op (line 12078) | struct pow_op : public opr_base<T>
method T (line 12082) | static inline T process(Type t1, Type t2) { return numeric::pow<T>(t1,...
method assign (line 12083) | static inline void assign(RefType t1, Type t2) { t1 = numeric::pow<T>(...
method type (line 12084) | static inline typename expression_node<T>::node_type type() { return e...
method operation (line 12085) | static inline details::operator_type operation() { return details::e_p...
type lt_op (line 12089) | struct lt_op : public opr_base<T>
method T (line 12092) | static inline T process(Type t1, Type t2) { return ((t1 < t2) ? T(1) :...
method T (line 12093) | static inline T process(const std::string& t1, const std::string& t2) ...
method type (line 12094) | static inline typename expression_node<T>::node_type type() { return e...
method operation (line 12095) | static inline details::operator_type operation() { return details::e_l...
type lte_op (line 12099) | struct lte_op : public opr_base<T>
method T (line 12102) | static inline T process(Type t1, Type t2) { return ((t1 <= t2) ? T(1) ...
method T (line 12103) | static inline T process(const std::string& t1, const std::string& t2) ...
method type (line 12104) | static inline typename expression_node<T>::node_type type() { return e...
method operation (line 12105) | static inline details::operator_type operation() { return details::e_l...
type gt_op (line 12109) | struct gt_op : public opr_base<T>
method T (line 12112) | static inline T process(Type t1, Type t2) { return ((t1 > t2) ? T(1) :...
method T (line 12113) | static inline T process(const std::string& t1, const std::string& t2) ...
method type (line 12114) | static inline typename expression_node<T>::node_type type() { return e...
method operation (line 12115) | static inline details::operator_type operation() { return details::e_g...
type gte_op (line 12119) | struct gte_op : public opr_base<T>
method T (line 12122) | static inline T process(Type t1, Type t2) { return ((t1 >= t2) ? T(1) ...
method T (line 12123) | static inline T process(const std::string& t1, const std::string& t2) ...
method type (line 12124) | static inline typename expression_node<T>::node_type type() { return e...
method operation (line 12125) | static inline details::operator_type operation() { return details::e_g...
type eq_op (line 12129) | struct eq_op : public opr_base<T>
method T (line 12132) | static inline T process(Type t1, Type t2) { return (std::equal_to<T>()...
method T (line 12133) | static inline T process(const std::string& t1, const std::string& t2) ...
method type (line 12134) | static inline typename expression_node<T>::node_type type() { return e...
method operation (line 12135) | static inline details::operator_type operation() { return details::e_e...
type equal_op (line 12139) | struct equal_op : public opr_base<T>
method T (line 12142) | static inline T process(Type t1, Type t2) { return numeric::equal(t1,t...
method T (line 12143) | static inline T process(const std::string& t1, const std::string& t2) ...
method type (line 12144) | static inline typename expression_node<T>::node_type type() { return e...
method operation (line 12145) | static inline details::operator_type operation() { return details::e_e...
type ne_op (line 12149) | struct ne_op : public opr_base<T>
method T (line 12152) | static inline T process(Type t1, Type t2) { return (std::not_equal_to<...
method T (line 12153) | static inline T process(const std::string& t1, const std::string& t2) ...
method type (line 12154) | static inline typename expression_node<T>::node_type type() { return e...
method operation (line 12155) | static inline details::operator_type operation() { return details::e_n...
type and_op (line 12159) | struct and_op : public opr_base<T>
method T (line 12162) | static inline T process(Type t1, Type t2) { return (details::is_true(t...
method type (line 12163) | static inline typename expression_node<T>::node_type type() { return e...
method operation (line 12164) | static inline details::operator_type operation() { return details::e_a...
type nand_op (line 12168) | struct nand_op : public opr_base<T>
method T (line 12171) | static inline T process(Type t1, Type t2) { return (details::is_true(t...
method type (line 12172) | static inline typename expression_node<T>::node_type type() { return e...
method operation (line 12173) | static inline details::operator_type operation() { return details::e_n...
type or_op (line 12177) | struct or_op : public opr_base<T>
method T (line 12180) | static inline T process(Type t1, Type t2) { return (details::is_true(t...
method type (line 12181) | static inline typename expression_node<T>::node_type type() { return e...
method operation (line 12182) | static inline details::operator_type operation() { return details::e_o...
type nor_op (line 12186) | struct nor_op : public opr_base<T>
method T (line 12189) | static inline T process(Type t1, Type t2) { return (details::is_true(t...
method type (line 12190) | static inline typename expression_node<T>::node_type type() { return e...
method operation (line 12191) | static inline details::operator_type operation() { return details::e_n...
type xor_op (line 12195) | struct xor_op : public opr_base<T>
method T (line 12198) | static inline T process(Type t1, Type t2) { return numeric::xor_opr<T>...
method type (line 12199) | static inline typename expression_node<T>::node_type type() { return e...
method operation (line 12200) | static inline details::operator_type operation() { return details::e_x...
type xnor_op (line 12204) | struct xnor_op : public opr_base<T>
method T (line 12207) | static inline T process(Type t1, Type t2) { return numeric::xnor_opr<T...
method type (line 12208) | static inline typename expression_node<T>::node_type type() { return e...
method operation (line 12209) | static inline details::operator_
Copy disabled (too large)
Download .json
Condensed preview — 2685 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (15,535K chars).
[
{
"path": ".cursor/rules/C/core.mdc",
"chars": 7690,
"preview": "---\ndescription: Enforce C++11 coding standards for Fledge plugins.\nglobs: [\"*.cpp\", \"*.h\"]\nalwaysApply: true\nauthor: \"D"
},
{
"path": ".cursor/rules/C/plugins/filter.mdc",
"chars": 11835,
"preview": "---\ndescription: C++ Filter Plugin Architecture.\nglobs: [\"*.cpp\", \"*.h\"]\nalwaysApply: true\nauthor: \"Devki Nandan Ghildiy"
},
{
"path": ".cursor/rules/C/plugins/north.mdc",
"chars": 12124,
"preview": "---\ndescription: C++ North Plugin Architecture.\nglobs: [\"*.cpp\", \"*.h\"]\nalwaysApply: true\nauthor: \"Devki Nandan Ghildiya"
},
{
"path": ".cursor/rules/C/plugins/south.mdc",
"chars": 12629,
"preview": "---\ndescription: C++ South Plugin Architecture.\nglobs: [\"*.cpp\", \"*.h\"]\nalwaysApply: true\nauthor: \"Devki Nandan Ghildiya"
},
{
"path": ".cursor/rules/README.md",
"chars": 12758,
"preview": "# 🎯 How to Use Cursor Rules with AI Prompts\n\nThis guide explains how to effectively use the Fledge Cursor rules for Pyth"
},
{
"path": ".cursor/rules/docs.mdc",
"chars": 15490,
"preview": "\n---\ndescription: \"Cursor AI rules for Fledge documentation - covers reStructuredText, Sphinx, file naming, and content "
},
{
"path": ".cursor/rules/python/api.mdc",
"chars": 10364,
"preview": "---\ndescription: \"Python API development rules for Fledge - REST APIs, routes, middleware, and web services\"\nglobs: \"pyt"
},
{
"path": ".cursor/rules/python/config.mdc",
"chars": 10106,
"preview": "---\ndescription: \"Python configuration and data management rules for Fledge - config system, reading objects, and data t"
},
{
"path": ".cursor/rules/python/core.mdc",
"chars": 9327,
"preview": "---\ndescription: \"Core Python development rules for Fledge - code style, imports, file structure, and naming conventions"
},
{
"path": ".cursor/rules/python/quality.mdc",
"chars": 6058,
"preview": "---\ndescription: \"Python quality rules for Fledge - dependencies, logging, performance, and version compatibility\"\nglobs"
},
{
"path": ".cursor/rules/tests/python/api.mdc",
"chars": 10867,
"preview": "---\ndescription: \"Python API integration testing rules for Fledge - conftest fixtures, HTTP client patterns, and API tes"
},
{
"path": ".cursor/rules/tests/python/unit.mdc",
"chars": 11633,
"preview": "---\ndescription: \"Python unit testing rules for Fledge - test organization, framework, execution, and coverage\"\nglobs: \""
},
{
"path": ".cursor/services/notification.mdc",
"chars": 13991,
"preview": "# Fledge Notification Service - Feature Development Rules (MDC Format)\n\n---\nmetadata:\n version: \"1.0.0\"\n last_updated:"
},
{
"path": ".cursor/services/notification_code_review.mdc",
"chars": 13753,
"preview": "---\ndescription: \nglobs: \nalwaysApply: true\n---\n# Fledge Notification Service - Multi-Document Context (MDC)\n\n### Projec"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 3300,
"preview": "name: \"🐛 Bug Report\"\ndescription: Create a new ticket for a bug.\ntitle: \"🐛 [BUG] - <title>\"\nlabels: [\"bug\"]\nassignees: M"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 28,
"preview": "blank_issues_enabled: false\n"
},
{
"path": ".github/ISSUE_TEMPLATE/doc_issue.yml",
"chars": 892,
"preview": "name: \"📝 Report a documentation issue\"\ndescription: \"Is something wrong, confusing or missing in the docs?\"\nlabels: [\"do"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.yml",
"chars": 1769,
"preview": "name: \"💡 Feature Request\"\ndescription: Create a new ticket for a new feature request\ntitle: \"💡 [REQUEST] - <title>\"\nlabe"
},
{
"path": ".github/workflows/checker.yml",
"chars": 3272,
"preview": "name: Checker\n\non:\n push:\n branches: ['**']\n\njobs:\n test:\n name: 🛠️ Build on ${{ matrix.os }}\n runs-on: ${{ m"
},
{
"path": ".gitignore",
"chars": 1307,
"preview": "\n# vi\n*.swp\n\n# MacOS Finder\n.DS_Store\n._*\n\n# IDE\n*.idea\n.vscode/\n\n# Data / cache files\ndata/etc/storage.json\ndata/etc/sq"
},
{
"path": ".readthedocs.yaml",
"chars": 1029,
"preview": "# Read the Docs configuration file for Sphinx projects\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html f"
},
{
"path": "ADOPTERS.MD",
"chars": 503,
"preview": "# Fledge Adopters\n\n- Beckhoff - PLC Vendor\n- Dianomic - IIoT Software\n- Flir - IR/Gas Cameras\n- General Atomics - Predat"
},
{
"path": "C/common/CMakeLists.txt",
"chars": 2526,
"preview": "cmake_minimum_required(VERSION 2.4.0)\n\nif(COMMAND cmake_policy)\n cmake_policy(SET CMP0003 NEW)\nendif(COMMAND cmake_po"
},
{
"path": "C/common/JSONPath.cpp",
"chars": 5309,
"preview": "/*\n * Fledge RapaidJSON JSONPath search helper\n *\n * Copyright (c) 2020 Dianomic Systems\n *\n * Released under the Apache"
},
{
"path": "C/common/acl.cpp",
"chars": 3654,
"preview": "/*\n * Fledge category management\n *\n * Copyright (c) 2022 Dianomic Systems\n *\n * Released under the Apache 2.0 Licence\n "
},
{
"path": "C/common/aggregate.cpp",
"chars": 487,
"preview": "/*\n * Fledge storage service client\n *\n * Copyright (c) 2018 OSIsoft, LLC\n *\n * Released under the Apache 2.0 Licence\n *"
},
{
"path": "C/common/asset_tracking.cpp",
"chars": 22572,
"preview": "/*\n * Fledge asset tracking related\n *\n * Copyright (c) 2019 Dianomic Systems\n *\n * Released under the Apache 2.0 Licenc"
},
{
"path": "C/common/audit_logger.cpp",
"chars": 1581,
"preview": "/*\n * Fledge Singleton Audit Logger interface\n *\n * Copyright (c) 2023 Dianomic Systems\n *\n * Released under the Apache "
},
{
"path": "C/common/base64databuffer.cpp",
"chars": 2587,
"preview": "/*\n * Fledge Base64 encoded DataBuffer\n *\n * Copyright (c) 2021 Dianomic Systems\n *\n * Released under the Apache 2.0 Lic"
},
{
"path": "C/common/base64image.cpp",
"chars": 2825,
"preview": "/*\n * Fledge Base64 encoded datapoint image\n *\n * Copyright (c) 2021 Dianomic Systems\n *\n * Released under the Apache 2."
},
{
"path": "C/common/bearer_token.cpp",
"chars": 3073,
"preview": "/*\n * Fledge bearer token utilities\n *\n * Copyright (c) 2022 Dianomic Systems\n *\n * Released under the Apache 2.0 Licenc"
},
{
"path": "C/common/config_category.cpp",
"chars": 57873,
"preview": "/*\n * Fledge category management\n *\n * Copyright (c) 2018 Dianomic Systems\n *\n * Released under the Apache 2.0 Licence\n "
},
{
"path": "C/common/cryptography_utils.cpp",
"chars": 3145,
"preview": "/*\n * Fledge utilities functions for generating cryptographic hash\n *\n * Copyright (c) 2025 Dianomic Systems\n *\n * Relea"
},
{
"path": "C/common/databuffer.cpp",
"chars": 1359,
"preview": "/*\n * Fledge\n *\n * Copyright (c) 2021 Dianomic Systems\n *\n * Released under the Apache 2.0 Licence\n *\n * Author: Mark Ri"
},
{
"path": "C/common/datapoint.cpp",
"chars": 9157,
"preview": "/*\n * Fledge\n *\n * Copyright (c) 2019 Dianomic Systems\n *\n * Released under the Apache 2.0 Licence\n *\n * Author: Amandee"
},
{
"path": "C/common/datapoint_utility.cpp",
"chars": 5166,
"preview": "/*\n * Datapoint utility.\n *\n * Copyright (c) 2020, RTE (https://www.rte-france.com)\n *\n * Released under the Apache 2.0 "
},
{
"path": "C/common/file_utils.cpp",
"chars": 2952,
"preview": "/*\n * Fledge utilities functions for handling files and directories\n *\n * Copyright (c) 2024 Dianomic Systems\n *\n * Rele"
},
{
"path": "C/common/filter_pipeline.cpp",
"chars": 17115,
"preview": "/*\n * Fledge plugin filter class\n *\n * Copyright (c) 2018 Dianomic Systems\n *\n * Released under the Apache 2.0 Licence\n "
},
{
"path": "C/common/filter_plugin.cpp",
"chars": 4277,
"preview": "/*\n * Fledge plugin filter class\n *\n * Copyright (c) 2018 Dianomic Systems\n *\n * Released under the Apache 2.0 Licence\n "
},
{
"path": "C/common/form_data.cpp",
"chars": 8990,
"preview": "/*\n * Fledge utilities functions for handling HTTP form data upload\n * with multipart data\n *\n * Copyright (c) 2022 Dian"
},
{
"path": "C/common/image.cpp",
"chars": 1816,
"preview": "/*\n * Fledge DPImage class \n *\n * Copyright (c) 2020 Dianomic System\n *\n * Released under the Apache 2.0 Licence\n *\n * A"
},
{
"path": "C/common/include/JSONPath.h",
"chars": 1483,
"preview": "/*\n * Fledge RapaidJSON JSONPath search helper\n *\n * Copyright (c) 2020 Dianomic Systems\n *\n * Released under the Apache"
},
{
"path": "C/common/include/acl.h",
"chars": 2018,
"preview": "#ifndef _ACL_H\n#define _ACL_H\n\n/*\n * Fledge ACL management\n *\n * Copyright (c) 2022 Dianomic Systems\n *\n * Released unde"
},
{
"path": "C/common/include/aggregate.h",
"chars": 534,
"preview": "#ifndef _AGGREGRATE_H\n#define _AGGREGRATE_H\n/*\n * Fledge storage client.\n *\n * Copyright (c) 2018 OSisoft, LLC\n *\n * Rel"
},
{
"path": "C/common/include/asset_tracking.h",
"chars": 8749,
"preview": "#ifndef _ASSET_TRACKING_H\n#define _ASSET_TRACKING_H\n/*\n * Fledge asset tracking related\n *\n * Copyright (c) 2018 OSisoft"
},
{
"path": "C/common/include/audit_logger.h",
"chars": 883,
"preview": "#ifndef _AUDIT_LOGGER_H\n#define _AUDIT_LOGGER_H\n/*\n * Fledge Singleton Audit Logger interface\n *\n * Copyright (c) 2023 D"
},
{
"path": "C/common/include/base64.h",
"chars": 1724,
"preview": "#ifndef _BASE64_H_\n#define _BASE64_H_\n#include <cstdint>\n/*\n * Fledge Base64 encoding and decoding tables\n *\n * Copyrigh"
},
{
"path": "C/common/include/base64databuffer.h",
"chars": 634,
"preview": "#ifndef _BASE64_DATA_BUFFER_H_\n#define _BASE64_DATA_BUFFER_H_\n/*\n * Fledge Base64DataBuffer encoding\n *\n * Copyright (c)"
},
{
"path": "C/common/include/base64dpimage.h",
"chars": 608,
"preview": "#ifndef _BASE64_DPIMAGE_H_\n#define _BASE64_DPIMAGE_H_\n/*\n * Fledge Base64 encoded data point image\n *\n * Copyright (c) 2"
},
{
"path": "C/common/include/bearer_token.h",
"chars": 1277,
"preview": "#ifndef _BEARER_TOKEN_H\n#define _BEARER_TOKEN_H\n/*\n * Fledge bearer token utilities\n *\n * Copyright (c) 2021 Dianomic Sy"
},
{
"path": "C/common/include/config_category.h",
"chars": 10856,
"preview": "#ifndef _CONFIG_CATEGORY_H\n#define _CONFIG_CATEGORY_H\n\n/*\n * Fledge category management\n *\n * Copyright (c) 2017-2018 OS"
},
{
"path": "C/common/include/cryptography_utils.h",
"chars": 582,
"preview": "#ifndef _CRYPTOGRAPHY_UTILS_H\n#define _CRYPTOGRAPHY_UTILS_H\n/*\n * Fledge utilities functions for generating cryptographi"
},
{
"path": "C/common/include/databuffer.h",
"chars": 1028,
"preview": "#ifndef _DATABUFFER_H\n#define _DATABUFFER_H\n/*\n * Fledge Databuffer type for datapoints\n *\n * Copyright (c) 2021 Dianomi"
},
{
"path": "C/common/include/datapoint.h",
"chars": 7448,
"preview": "#ifndef _DATAPOINT_H\n#define _DATAPOINT_H\n/*\n * Fledge\n *\n * Copyright (c) 2018 OSisoft, LLC\n *\n * Released under the Ap"
},
{
"path": "C/common/include/datapoint_utility.h",
"chars": 1555,
"preview": "#ifndef INCLUDE_DATAPOINT_UTILITY_H_\n#define INCLUDE_DATAPOINT_UTILITY_H_\n/*\n * Fledge\n *\n * Copyright (c) 2021 Dianomic"
},
{
"path": "C/common/include/dpimage.h",
"chars": 1294,
"preview": "#ifndef _DPIMAGE_H\n#define _DPIMAGE_H\n/*\n * Fledge datapoint image\n *\n * Copyright (c) 2021 Dianomic Systems\n *\n * Relea"
},
{
"path": "C/common/include/expression.h",
"chars": 1779,
"preview": "#ifndef _EXPRESSION_H\n#define _EXPRESSION_H\n/*\n * Fledge storage client.\n *\n * Copyright (c) 2018 OSisoft, LLC\n *\n * Rel"
},
{
"path": "C/common/include/exprtk.hpp",
"chars": 1379013,
"preview": "/*\n ******************************************************************\n * C++ Mathematical Expression Toolkit "
},
{
"path": "C/common/include/file_utils.h",
"chars": 361,
"preview": "/*\n * Fledge utilities functions for handling files and directories\n *\n * Copyright (c) 2024 Dianomic Systems\n *\n * Rele"
},
{
"path": "C/common/include/filter_pipeline.h",
"chars": 3129,
"preview": "#ifndef _FILTER_PIPELINE_H\n#define _FILTER_PIPELINE_H\n/*\n * Fledge filter pipeline class.\n *\n * Copyright (c) 2018 Diano"
},
{
"path": "C/common/include/filter_plugin.h",
"chars": 1966,
"preview": "#ifndef _FILTER_PLUGIN_H\n#define _FILTER_PLUGIN_H\n/*\n * Fledge filter plugin class.\n *\n * Copyright (c) 2018 Dianomic Sy"
},
{
"path": "C/common/include/form_data.h",
"chars": 1591,
"preview": "#ifndef _FORM_DATA_H\n#define _FORM_DATA_H\n/*\n * Fledge utilities functions for handling HTTP form data upload\n * with mu"
},
{
"path": "C/common/include/insert.h",
"chars": 3566,
"preview": "#ifndef _INSERT_H\n#define _INSERT_H\n/*\n * Fledge storage client.\n *\n * Copyright (c) 2018 OSisoft, LLC\n *\n * Released un"
},
{
"path": "C/common/include/join.h",
"chars": 810,
"preview": "#ifndef _JOIN_H\n#define _JOIN_H\n/*\n * Fledge storage client.\n *\n * Copyright (c) 2022 Dianomic Systems\n *\n * Released un"
},
{
"path": "C/common/include/json_properties.h",
"chars": 1631,
"preview": "#ifndef _JSON_PROPERTIES_H\n#define _JSON_PROPERTIES_H\n/*\n * Fledge storage client.\n *\n * Copyright (c) 2018 Dianomic Sys"
},
{
"path": "C/common/include/json_provider.h",
"chars": 298,
"preview": "#ifndef _JSONPROVIDER_H\n#define _JSONPROVIDER_H\n/*\n * Fledge storage service.\n *\n * Copyright (c) 2017 OSisoft, LLC\n *\n "
},
{
"path": "C/common/include/json_utils.h",
"chars": 528,
"preview": "#ifndef _JSON_UTILS_H\n#define _JSON_UTILS_H\n/*\n * Fledge utilities functions for handling JSON document\n *\n * Copyright "
},
{
"path": "C/common/include/logger.h",
"chars": 2946,
"preview": "#ifndef _LOGGER_H\n#define _LOGGER_H\n/*\n * Fledge storage service.\n *\n * Copyright (c) 2017-2018 OSisoft, LLC\n *\n * Relea"
},
{
"path": "C/common/include/management_client.h",
"chars": 7982,
"preview": "#ifndef _MANAGEMENT_CLIENT_H\n#define _MANAGEMENT_CLIENT_H\n/*\n * Fledge storage service.\n *\n * Copyright (c) 2017-2018 OS"
},
{
"path": "C/common/include/pipeline_debugger.h",
"chars": 825,
"preview": "#ifndef _PIPELINE_DEBUGGER_H\n#define _PIPELINE_DEBUGGER_H\n/*\n * Fledge filter pipeline debugger.\n *\n * Copyright (c) 202"
},
{
"path": "C/common/include/pipeline_element.h",
"chars": 6279,
"preview": "#ifndef _PIPELINE_ELEMENT_H\n#define _PIPELINE_ELEMENT_H\n/*\n * Fledge filter pipeline elements.\n *\n * Copyright (c) 2024 "
},
{
"path": "C/common/include/plugin_data.h",
"chars": 582,
"preview": "#ifndef _PLUGIN_DATA_H\n#define _PLUGIN_DATA_H\n/*\n * Fledge persist plugin data class.\n *\n * Copyright (c) 2018 Dianomic "
},
{
"path": "C/common/include/process.h",
"chars": 1127,
"preview": "#ifndef _PROCESS_H\n#define _PROCESS_H\n/*\n * Fledge process base class\n *\n * Copyright (c) 2018 Dianomic Systems\n *\n * Re"
},
{
"path": "C/common/include/purge_result.h",
"chars": 923,
"preview": "#ifndef _PURGE_RESULT_H\n#define _PURGE_RESULT_H\n/*\n * Fledge storage client.\n *\n * Copyright (c) 2018 Dianomic Systems\n "
},
{
"path": "C/common/include/pyruntime.h",
"chars": 872,
"preview": "#ifndef _PYRUNTIME_H\n#define _PYRUNTIME_H\n/*\n * Fledge Python Runtime.\n *\n * Copyright (c) 2021 Dianomic Systems\n *\n * R"
},
{
"path": "C/common/include/pythonconfigcategory.h",
"chars": 560,
"preview": "#ifndef _PYTHONCONFIGCATEGORY_H\n#define _PYTHONCONFIGCATEGORY_H\n/*\n * Fledge Python Configuration Category\n *\n * Copyrig"
},
{
"path": "C/common/include/pythonreading.h",
"chars": 821,
"preview": "#ifndef _PYTHONREADING_H\n#define _PYTHONREADING_H\n/*\n * Fledge Python Reading\n *\n * Copyright (c) 2021 Dianomic Systems\n"
},
{
"path": "C/common/include/pythonreadingset.h",
"chars": 635,
"preview": "#ifndef _PYTHON_READING_SET_H_\n#define _PYTHON_READING_SET_H_\n/*\n * Fledge Python Reading Set\n *\n * Copyright (c) 2021 D"
},
{
"path": "C/common/include/query.h",
"chars": 1498,
"preview": "#ifndef _QUERY_H\n#define _QUERY_H\n/*\n * Fledge storage client.\n *\n * Copyright (c) 2018 OSisoft, LLC\n *\n * Released unde"
},
{
"path": "C/common/include/reading.h",
"chars": 4700,
"preview": "#ifndef _READING_H\n#define _READING_H\n/*\n * Fledge storage client.\n *\n * Copyright (c) 2018 OSisoft, LLC\n *\n * Released "
},
{
"path": "C/common/include/reading_circularbuffer.h",
"chars": 1034,
"preview": "#ifndef _READING_CIRCULARBUFFER_H\n#define _READING_CIRCULARBUFFER_H\n/*\n * Fledge Reading Circular Buffer.\n *\n * Copyrigh"
},
{
"path": "C/common/include/reading_set.h",
"chars": 2731,
"preview": "#ifndef _READINGSET_H\n#define _READINGSET_H\n/*\n * Fledge storage client.\n *\n * Copyright (c) 2018 Dianomic Systems\n *\n *"
},
{
"path": "C/common/include/reading_stream.h",
"chars": 916,
"preview": "#ifndef _READING_STREAM_H\n#define _READING_STREAM_H\n/*\n * Fledge storage reading stream protocol definitions.\n *\n * Copy"
},
{
"path": "C/common/include/readingset_circularbuffer.h",
"chars": 1125,
"preview": "#ifndef _READINGSETCIRCULARBUFFER_H\n#define _READINGSETCIRCULARBUFFER_H\n/*\n * Fledge ReadingSet Circular Buffer.\n *\n * C"
},
{
"path": "C/common/include/resultset.h",
"chars": 4697,
"preview": "#ifndef _RESULTSET_H\n#define _RESULTSET_H\n/*\n * Fledge storage client.\n *\n * Copyright (c) 2018 Dianomic Systems\n *\n * R"
},
{
"path": "C/common/include/returns.h",
"chars": 1481,
"preview": "#ifndef _RETURNS_H\n#define _RETURNS_H\n/*\n * Fledge storage client.\n *\n * Copyright (c) 2018 OSisoft, LLC\n *\n * Released "
},
{
"path": "C/common/include/service_record.h",
"chars": 2033,
"preview": "#ifndef _SERVICE_RECORD_H\n#define _SERVICE_RECORD_H\n/*\n * Fledge storage service.\n *\n * Copyright (c) 2017 OSisoft, LLC\n"
},
{
"path": "C/common/include/sort.h",
"chars": 773,
"preview": "#ifndef _SORT_H\n#define _SORT_H\n/*\n * Fledge storage client.\n *\n * Copyright (c) 2018 OSisoft, LLC\n *\n * Released under "
},
{
"path": "C/common/include/storage_client.h",
"chars": 6647,
"preview": "#ifndef _STORAGE_CLIENT_H\n#define _STORAGE_CLIENT_H\n/*\n * Fledge storage client.\n *\n * Copyright (c) 2018 OSisoft, LLC\n "
},
{
"path": "C/common/include/string_utils.h",
"chars": 1681,
"preview": "#ifndef _STRING_UTILS_H\n#define _STRING_UTILS_H\n/*\n * Fledge utilities functions for handling stringa\n *\n * Copyright (c"
},
{
"path": "C/common/include/timebucket.h",
"chars": 1125,
"preview": "#ifndef _TIMEBUCKET_H\n#define _TIMEBUCKET_H\n/*\n * Fledge storage client.\n *\n * Copyright (c) 2018 OSisoft, LLC\n *\n * Rel"
},
{
"path": "C/common/include/update_modifier.h",
"chars": 588,
"preview": "#ifndef _UPDATE_MODIFIER_H\n#define _UPDATE_MODIFIER_H\n/*\n * Fledge storage client.\n *\n * Copyright (c) 2022 Dianonic Sys"
},
{
"path": "C/common/include/utils.h",
"chars": 3175,
"preview": "#ifndef _FLEDGE_UTILS_H\n#define _FLEDGE_UTILS_H\n/*\n * Fledge general utilities\n *\n * Copyright (c) 2018 Dianomic Systems"
},
{
"path": "C/common/include/value.h",
"chars": 1422,
"preview": "#ifndef _VALUE_H\n#define _VALUE_H\n/*\n * Fledge storage client.\n *\n * Copyright (c) 2018 OSisoft, LLC\n *\n * Released unde"
},
{
"path": "C/common/include/where.h",
"chars": 2082,
"preview": "#ifndef _WHERE_H\n#define _WHERE_H\n/*\n * Fledge storage client.\n *\n * Copyright (c) 2018 OSisoft, LLC\n *\n * Released unde"
},
{
"path": "C/common/join.cpp",
"chars": 781,
"preview": "/*\n * Fledge storage service client\n *\n * Copyright (c) 2022 Dianomic Systems\n *\n * Released under the Apache 2.0 Licenc"
},
{
"path": "C/common/json_utils.cpp",
"chars": 2661,
"preview": "/*\n * Fledge utilities functions for handling JSON document\n *\n * Copyright (c) 2018 Dianomic Systems\n *\n * Released und"
},
{
"path": "C/common/logger.cpp",
"chars": 12853,
"preview": "/*\n * Fledge storage service.\n *\n * Copyright (c) 2017-2018 OSisoft, LLC\n *\n * Released under the Apache 2.0 Licence\n *\n"
},
{
"path": "C/common/management_client.cpp",
"chars": 68392,
"preview": "/*\n * Fledge storage service.\n *\n * Copyright (c) 2017-2021 OSisoft, LLC\n *\n * Released under the Apache 2.0 Licence\n *\n"
},
{
"path": "C/common/pipeline_branch.cpp",
"chars": 6709,
"preview": "/*\n * Fledge pipeline branch class\n *\n * Copyright (c) 2024 Dianomic Systems\n *\n * Released under the Apache 2.0 Licence"
},
{
"path": "C/common/pipeline_debugger.cpp",
"chars": 2111,
"preview": "/*\n * Fledge pipeline debugger class\n *\n * Copyright (c) 2025 Dianomic Systems\n *\n * Released under the Apache 2.0 Licen"
},
{
"path": "C/common/pipeline_element.cpp",
"chars": 1363,
"preview": "/*\n * Fledge pipeline element classes\n *\n * Copyright (c) 2024 Dianomic Systems\n *\n * Released under the Apache 2.0 Lice"
},
{
"path": "C/common/pipeline_filter.cpp",
"chars": 6824,
"preview": "/*\n * Fledge pipeline filter class\n *\n * Copyright (c) 2024 Dianomic Systems\n *\n * Released under the Apache 2.0 Licence"
},
{
"path": "C/common/pipeline_writer.cpp",
"chars": 1487,
"preview": "/*\n * Fledge pipeline writer class\n *\n * Copyright (c) 2024 Dianomic Systems\n *\n * Released under the Apache 2.0 Licence"
},
{
"path": "C/common/plugin_data.cpp",
"chars": 3983,
"preview": "/*\n * Fledge persist plugin data class.\n *\n * Copyright (c) 2018 Dianomic Systems\n *\n * Released under the Apache 2.0 Li"
},
{
"path": "C/common/process.cpp",
"chars": 4792,
"preview": "/*\n * Fledge process class\n *\n * Copyright (c) 2018 Dianomic Systems\n *\n * Released under the Apache 2.0 Licence\n *\n * A"
},
{
"path": "C/common/purge_result.cpp",
"chars": 1030,
"preview": "/*\n * Fledge storage service client\n *\n * Copyright (c) 2018 Dianomic Systems\n *\n * Released under the Apache 2.0 Licenc"
},
{
"path": "C/common/pyexception.cpp",
"chars": 2394,
"preview": "/*\n * Fledge Python runtime\n *\n * Copyright (c) 2021 Dianomic Systems\n *\n * Released under the Apache 2.0 Licence\n *\n * "
},
{
"path": "C/common/pyruntime.cpp",
"chars": 8669,
"preview": "/*\n * Fledge Python runtime\n *\n * Copyright (c) 2021 Dianomic Systems\n *\n * Released under the Apache 2.0 Licence\n *\n * "
},
{
"path": "C/common/pythonconfigcategory.cpp",
"chars": 6578,
"preview": "/*\n * Fledge Python Config Category\n *\n * Copyright (c) 2021 Dianomic Systems\n *\n * Released under the Apache 2.0 Licenc"
},
{
"path": "C/common/pythonreading.cpp",
"chars": 19868,
"preview": "/*\n * Fledge Python Reading\n *\n * Copyright (c) 2021 Dianomic Systems\n *\n * Released under the Apache 2.0 Licence\n *\n * "
},
{
"path": "C/common/pythonreadingset.cpp",
"chars": 4819,
"preview": "/*\n * Fledge Python Reading Set\n *\n * Copyright (c) 2021 Dianomic Systems\n *\n * Released under the Apache 2.0 Licence\n *"
},
{
"path": "C/common/query.cpp",
"chars": 7328,
"preview": "/*\n * Fledge storage service client\n *\n * Copyright (c) 2018 OSIsoft, LLC\n *\n * Released under the Apache 2.0 Licence\n *"
},
{
"path": "C/common/reading.cpp",
"chars": 18190,
"preview": "/*\n * Fledge storage service client\n *\n * Copyright (c) 2018 OSIsoft, LLC\n *\n * Released under the Apache 2.0 Licence\n *"
},
{
"path": "C/common/reading_circularbuffer.cpp",
"chars": 2063,
"preview": "/*\n * Fledge reading circular buffer class\n *\n * Copyright (c) 2025 Dianomic Systems\n *\n * Released under the Apache 2.0"
},
{
"path": "C/common/reading_set.cpp",
"chars": 17962,
"preview": "/*\n * Fledge storage service client\n *\n * Copyright (c) 2018 Dianomic Systems\n *\n * Released under the Apache 2.0 Licenc"
},
{
"path": "C/common/readingset_circularbuffer.cpp",
"chars": 3768,
"preview": "/*\n * Fledge ReadingSet Circular Buffer.\n *\n * Copyright (c) 2024 Dianomic Systems\n *\n * Released under the Apache 2.0 L"
},
{
"path": "C/common/result_set.cpp",
"chars": 9695,
"preview": "/*\n * Fledge storage service client\n *\n * Copyright (c) 2018 Dianomic Systems\n *\n * Released under the Apache 2.0 Licenc"
},
{
"path": "C/common/service_record.cpp",
"chars": 1855,
"preview": "/*\n * Fledge storage service.\n *\n * Copyright (c) 2017 OSisoft, LLC\n *\n * Released under the Apache 2.0 Licence\n *\n * Au"
},
{
"path": "C/common/storage_client.cpp",
"chars": 61480,
"preview": "/*\n * Fledge storage service client\n *\n * Copyright (c) 2018 Dianomic Systems\n *\n * Released under the Apache 2.0 Licenc"
},
{
"path": "C/common/string_utils.cpp",
"chars": 10026,
"preview": "/*\n * Fledge utilities functions for handling JSON document\n *\n * Copyright (c) 2018 Dianomic Systems\n *\n * Released und"
},
{
"path": "C/common/where.cpp",
"chars": 1680,
"preview": "/*\n * Fledge storage service client\n *\n * Copyright (c) 2018 OSIsoft, LLC\n *\n * Released under the Apache 2.0 Licence\n *"
},
{
"path": "C/plugins/common/CMakeLists.txt",
"chars": 1437,
"preview": "cmake_minimum_required(VERSION 2.6.0)\n\nproject(plugins-common-lib)\n\nset(CMAKE_CXX_FLAGS_DEBUG \"-O0 -ggdb\")\nset(CMAKE_CXX"
},
{
"path": "C/plugins/common/http_sender.cpp",
"chars": 2647,
"preview": "/*\n * Fledge HTTP Sender wrapper.\n *\n * Copyright (c) 2018 Dianomic Systems\n *\n * Released under the Apache 2.0 Licence\n"
},
{
"path": "C/plugins/common/include/http_sender.h",
"chars": 3074,
"preview": "#ifndef _HTTP_SENDER_H\n#define _HTTP_SENDER_H\n/*\n * Fledge HTTP Sender wrapper.\n *\n * Copyright (c) 2018 Dianomic System"
},
{
"path": "C/plugins/common/include/libcurl_https.h",
"chars": 3390,
"preview": "#ifndef _LIBCURL_HTTPS_H\n#define _LIBCURL_HTTPS_H\n/*\n * Fledge HTTP Sender wrapper.\n *\n * Copyright (c) 2019 Diamnomic S"
},
{
"path": "C/plugins/common/include/piwebapi.h",
"chars": 1607,
"preview": "#ifndef _PIWEBAPI_H\n#define _PIWEBAPI_H\n/*\n * Fledge OSIsoft PI Web API integration.\n *\n * Copyright (c) 2020-2022 Diano"
},
{
"path": "C/plugins/common/include/simple_http.h",
"chars": 3120,
"preview": "#ifndef _SIMPLE_HTTP_H\n#define _SIMPLE_HTTP_H\n/*\n * Fledge HTTP Sender wrapper.\n *\n * Copyright (c) 2018 Dianomic System"
},
{
"path": "C/plugins/common/include/simple_https.h",
"chars": 3170,
"preview": "#ifndef _SIMPLE_HTTPS_H\n#define _SIMPLE_HTTPS_H\n/*\n * Fledge HTTP Sender wrapper.\n *\n * Copyright (c) 2018 Diamnomic Sys"
},
{
"path": "C/plugins/common/libcurl_https.cpp",
"chars": 13290,
"preview": "/*\n * Fledge HTTPS Sender implementation using the libcurl library\n * - https://curl.haxx.se/libcurl/\n * - https://git"
},
{
"path": "C/plugins/common/piwebapi.cpp",
"chars": 9413,
"preview": "/*\n * Fledge OSIsoft PI Web API integration.\n * Implements the integration for the specific functionalities exposed by P"
},
{
"path": "C/plugins/common/simple_http.cpp",
"chars": 7198,
"preview": "/*\n * Fledge HTTP Sender implementation using the\n * Simple Web Seerver HTTP library.\n *\n * Copyright (c) 2018 Dianomic "
},
{
"path": "C/plugins/common/simple_https.cpp",
"chars": 7681,
"preview": "/*\n * Fledge HTTP Sender implementation using the\n * HTTPS Simple Web Server library\n *\n * Copyright (c) 2018 Dianomic S"
},
{
"path": "C/plugins/filter/common/CMakeLists.txt",
"chars": 1259,
"preview": "cmake_minimum_required(VERSION 2.4.0)\n\nproject(filters-common-lib)\n\nset(CMAKE_CXX_FLAGS_DEBUG \"-O0 -ggdb\")\nset(CMAKE_CXX"
},
{
"path": "C/plugins/filter/common/filter.cpp",
"chars": 1381,
"preview": "/*\n * Fledge base FledgeFilter class\n *\n * Copyright (c) 2018 Dianomic Systems\n *\n * Released under the Apache 2.0 Licen"
},
{
"path": "C/plugins/filter/common/include/filter.h",
"chars": 895,
"preview": "#ifndef _FLEDGE_FITER_H\n#define _FLEDGE_FITER_H\n/*\n * Fledge base FledgeFilter class\n *\n * Copyright (c) 2018 Dianomic S"
},
{
"path": "C/plugins/north/OMF/CMakeLists.txt",
"chars": 1303,
"preview": "cmake_minimum_required(VERSION 2.6.0)\n\nproject(OMF)\n\nset(CMAKE_CXX_FLAGS \"-std=c++11 -O3\")\n\nset_source_files_properties("
},
{
"path": "C/plugins/north/OMF/OMFError.cpp",
"chars": 8857,
"preview": "/*\n * Fledge OSIsoft OMF interface to PI Server.\n *\n * Copyright (c) 2023 Dianomic Systems\n *\n * Released under the Apac"
},
{
"path": "C/plugins/north/OMF/include/OMFHint.h",
"chars": 3894,
"preview": "#ifndef _OMF_HINT_H\n#define _OMF_HINT_H\n\n#include <rapidjson/document.h>\n\n/**\n * Virtual base class for an OMF Hint\n */\n"
},
{
"path": "C/plugins/north/OMF/include/basetypes.h",
"chars": 2937,
"preview": "#ifndef _BASETYPES_H\n#define _BASETYPES_H\n/*\n * Fledge OSIsoft OMF interface to PI Server.\n *\n * Copyright (c) 2022 Dian"
},
{
"path": "C/plugins/north/OMF/include/linkedlookup.h",
"chars": 2672,
"preview": "#ifndef _LINKEDLOOKUP_H\n#define _LINKEDLOOKUP_H\ntypedef enum {\n\tOMFBT_UNKNOWN, OMFBT_DOUBLE64, OMFBT_DOUBLE32, OMFBT_INT"
},
{
"path": "C/plugins/north/OMF/include/ocs.h",
"chars": 1076,
"preview": "#ifndef _OCS_H\n#define _OCS_H\n/*\n * Fledge OSIsoft ADH and OCS integration.\n *\n * Copyright (c) 2020-2025 Dianomic Syste"
},
{
"path": "C/plugins/north/OMF/include/omf.h",
"chars": 19860,
"preview": "#ifndef _OMF_H\n#define _OMF_H\n/*\n * Fledge OSIsoft OMF interface to PI Server.\n *\n * Copyright (c) 2018-2025 Dianomic Sy"
},
{
"path": "C/plugins/north/OMF/include/omfbuffer.h",
"chars": 1219,
"preview": "#ifndef _OMF_BUFFER_H\n#define _OMF_BUFFER_H\n/*\n * Fledge OMF North plugin buffer class\n *\n * Copyright (c) 2023 Dianomic"
},
{
"path": "C/plugins/north/OMF/include/omferror.h",
"chars": 2287,
"preview": "#ifndef _OMFERROR_H\n#define _OMFERROR_H\n/*\n * Fledge OSIsoft OMF interface to PI Server.\n *\n * Copyright (c) 2023 Dianom"
},
{
"path": "C/plugins/north/OMF/include/omfinfo.h",
"chars": 8066,
"preview": "#ifndef _OMFINFO_H\n#define _OMFINFO_H\n/*\n * Fledge OSIsoft OMF interface to PI Server.\n *\n * Copyright (c) 2023-2025 Dia"
},
{
"path": "C/plugins/north/OMF/include/omflinkeddata.h",
"chars": 3864,
"preview": "#ifndef OMFLINKEDDATA_H\n#define OMFLINKEDDATA_H\n/*\n * Fledge OSIsoft OMF interface to PI Server.\n *\n * Copyright (c) 202"
},
{
"path": "C/plugins/north/OMF/linkdata.cpp",
"chars": 24764,
"preview": "/*\n * Fledge OSIsoft OMF interface to PI Server.\n *\n * Copyright (c) 2022-2025 Dianomic Systems\n *\n * Released under the"
},
{
"path": "C/plugins/north/OMF/ocs.cpp",
"chars": 4520,
"preview": "/*\n * Fledge OSIsoft ADH and OCS integration.\n * Implements the integration for the specific functionalities exposed by "
},
{
"path": "C/plugins/north/OMF/omf.cpp",
"chars": 148691,
"preview": "/*\n * Fledge OSIsoft OMF interface to PI Server.\n *\n * Copyright (c) 2018-2025 Dianomic Systems\n *\n * Released under the"
},
{
"path": "C/plugins/north/OMF/omfbuffer.cpp",
"chars": 7855,
"preview": "/*\n * Fledge OMF north plugin buffer class\n *\n * Copyright (c) 2023 Dianomic Systems\n *\n * Released under the Apache 2.0"
},
{
"path": "C/plugins/north/OMF/omfhints.cpp",
"chars": 9827,
"preview": "/*\n * Fledge OSI Soft OMF interface to PI Server.\n *\n * Copyright (c) 2020 Dianomic Systems\n *\n * Released under the Apa"
},
{
"path": "C/plugins/north/OMF/omfinfo.cpp",
"chars": 48674,
"preview": "/*\n * Fledge OSIsoft OMF interface to PI Server.\n *\n * Copyright (c) 2023-2025 Dianomic Systems\n *\n * Released under the"
},
{
"path": "C/plugins/north/OMF/plugin.cpp",
"chars": 15410,
"preview": "/*\n * Fledge PI Server north plugin.\n *\n * Copyright (c) 2018-2022 Dianomic Systems\n *\n * Released under the Apache 2.0 "
},
{
"path": "C/plugins/storage/CMakeLists.txt",
"chars": 187,
"preview": "cmake_minimum_required (VERSION 2.8.8)\nproject (FledgeStoragePlugins)\n\nset(CMAKE_CXX_FLAGS \"-std=c++11 -O3\")\n\nadd_subdir"
},
{
"path": "C/plugins/storage/README.rst",
"chars": 525,
"preview": ".. |br| raw:: html\n\n <br />\n\n\n***************\nStorage Plugins\n***************\n\nThis directory contains the source code"
},
{
"path": "C/plugins/storage/common/CMakeLists.txt",
"chars": 653,
"preview": "cmake_minimum_required(VERSION 2.4.0)\n\nproject(storage-common-lib)\n\nset(CMAKE_CXX_FLAGS_DEBUG \"-O0 -ggdb\")\nset(CMAKE_CXX"
},
{
"path": "C/plugins/storage/common/disk_monitor.cpp",
"chars": 5477,
"preview": "/*\n * Fledge storage service.\n *\n * Copyright (c) 2024 Dianomic Systems\n *\n * Released under the Apache 2.0 Licence\n *\n "
},
{
"path": "C/plugins/storage/common/include/disk_monitor.h",
"chars": 918,
"preview": "#ifndef _DISK_SPACE_MONITOR_H\n#define _DISK_SPACE_MONITOR_H\n/*\n * Fledge storage service.\n *\n * Copyright (c) 2024 Diano"
},
{
"path": "C/plugins/storage/common/include/sql_buffer.h",
"chars": 1140,
"preview": "#ifndef _SQL_BUFFER_H\n#define _SQL_BUFFER_H\n/*\n * Fledge storage service.\n *\n * Copyright (c) 2017 OSisoft, LLC\n *\n * Re"
},
{
"path": "C/plugins/storage/common/sql_buffer.cpp",
"chars": 7842,
"preview": "/*\n * Fledge storage service.\n *\n * Copyright (c) 2017 OSisoft, LLC\n *\n * Released under the Apache 2.0 Licence\n *\n * Au"
},
{
"path": "C/plugins/storage/postgres/CMakeLists.txt",
"chars": 1297,
"preview": "cmake_minimum_required(VERSION 2.6.0)\n\nproject(postgres)\n\nset(CMAKE_CXX_FLAGS_DEBUG \"-O0 -ggdb\")\nset(CMAKE_CXX_FLAGS \"${"
},
{
"path": "C/plugins/storage/postgres/CheckRhPg.cmake",
"chars": 731,
"preview": "# Evaluates if rh-postgresql13 is available and enabled and identifies its path\n\nexecute_process(\n COMMAND \"scl\""
},
{
"path": "C/plugins/storage/postgres/README.rst",
"chars": 544,
"preview": "*************************\nPostgreSQL Storage Plugin\n*************************\n\nThis directory contains the source code f"
},
{
"path": "C/plugins/storage/postgres/connection.cpp",
"chars": 138840,
"preview": "/*\n * Fledge storage service.\n *\n * Copyright (c) 2017 OSisoft, LLC\n *\n * Released under the Apache 2.0 Licence\n *\n * Au"
},
{
"path": "C/plugins/storage/postgres/connection_manager.cpp",
"chars": 3385,
"preview": "/*\n * Fledge storage service.\n *\n * Copyright (c) 2017 OSisoft, LLC\n *\n * Released under the Apache 2.0 Licence\n *\n * Au"
},
{
"path": "C/plugins/storage/postgres/include/connection.h",
"chars": 5108,
"preview": "#ifndef _CONNECTION_H\n#define _CONNECTION_H\n/*\n * Fledge storage service.\n *\n * Copyright (c) 2017 OSisoft, LLC\n *\n * Re"
},
{
"path": "C/plugins/storage/postgres/include/connection_manager.h",
"chars": 1237,
"preview": "#ifndef _CONNECTION_MANAGER_H\n#define _CONNECTION_MANAGER_H\n/*\n * Fledge storage service.\n *\n * Copyright (c) 2017 OSiso"
},
{
"path": "C/plugins/storage/postgres/plugin.cpp",
"chars": 11970,
"preview": "/*\n * Fledge storage service.\n *\n * Copyright (c) 2017-2018 OSisoft, LLC\n *\n * Released under the Apache 2.0 Licence\n *\n"
},
{
"path": "C/plugins/storage/sqlite/CMakeLists.txt",
"chars": 1939,
"preview": "cmake_minimum_required(VERSION 2.6.0)\n\nproject(sqlite)\n\nset(CMAKE_CXX_FLAGS_DEBUG \"-O0 -ggdb\")\nset(CMAKE_CXX_FLAGS \"${CM"
},
{
"path": "C/plugins/storage/sqlite/Findsqlite3.cmake",
"chars": 1322,
"preview": "# This CMake file locates the SQLite3 development libraries\n#\n# The following variables are set:\n# SQLITE_FOUND - If the"
},
{
"path": "C/plugins/storage/sqlite/common/connection.cpp",
"chars": 92750,
"preview": "/*\n * Fledge storage service.\n *\n * Copyright (c) 2018 OSIsoft, LLC\n *\n * Released under the Apache 2.0 Licence\n *\n * Au"
},
{
"path": "C/plugins/storage/sqlite/common/connection_manager.cpp",
"chars": 14672,
"preview": "/*\n * Fledge storage service.\n *\n * Copyright (c) 2017 OSisoft, LLC\n *\n * Released under the Apache 2.0 Licence\n *\n * Au"
},
{
"path": "C/plugins/storage/sqlite/common/include/connection.h",
"chars": 7862,
"preview": "#ifndef _CONNECTION_H\n#define _CONNECTION_H\n/*\n * Fledge storage service.\n *\n * Copyright (c) 2018 OSisoft, LLC\n *\n * Re"
},
{
"path": "C/plugins/storage/sqlite/common/include/connection_manager.h",
"chars": 2325,
"preview": "#ifndef _CONNECTION_MANAGER_H\n#define _CONNECTION_MANAGER_H\n/*\n * Fledge storage service.\n *\n * Copyright (c) 2017 OSiso"
},
{
"path": "C/plugins/storage/sqlite/common/include/purge_configuration.h",
"chars": 805,
"preview": "#ifndef _PURGE_CONFIGURATION_H\n#define _PURGE_CONFIGURATION_H\n/*\n * Fledge storage service - Purge configuration\n *\n * C"
},
{
"path": "C/plugins/storage/sqlite/common/include/readings_catalogue.h",
"chars": 10812,
"preview": "#ifndef _READINGS_CATALOGUE_H\n#define _READINGS_CATALOGUE_H\n/*\n * Fledge storage service - Readings catalogue handling\n "
},
{
"path": "C/plugins/storage/sqlite/common/include/sqlite_common.h",
"chars": 2517,
"preview": "#ifndef _COMMON_CONNECTION_H\n#define _COMMON_CONNECTION_H\n\n#include <sql_buffer.h>\n#include <iostream>\n#include <sqlite3"
},
{
"path": "C/plugins/storage/sqlite/common/purge_configuration.cpp",
"chars": 1642,
"preview": "/*\n * Fledge Fledge Configuration management.\n *\n * Copyright (c) 2021 Dianomic Systems\n *\n * Released under the Apache "
},
{
"path": "C/plugins/storage/sqlite/common/readings.cpp",
"chars": 70700,
"preview": "/*\n * Fledge storage service.\n *\n * Copyright (c) 2018 OSIsoft, LLC\n *\n * Released under the Apache 2.0 Licence\n *\n * Au"
},
{
"path": "C/plugins/storage/sqlite/common/readings_catalogue.cpp",
"chars": 81395,
"preview": "/*\n * Fledge storage service - Readings catalogue handling\n *\n * Copyright (c) 2020 OSisoft, LLC\n *\n * Released under th"
},
{
"path": "C/plugins/storage/sqlite/include/common.h",
"chars": 1567,
"preview": "#ifndef _COMMON_CONNECTION_H\n#define _COMMON_CONNECTION_H\n\n#include <sql_buffer.h>\n#include <iostream>\n#include <sqlite3"
},
{
"path": "C/plugins/storage/sqlite/include/profile.h",
"chars": 2771,
"preview": "#ifndef _PROFILE_H\n#define _PROFILE_H\n/*\n * Fledge storage service.\n *\n * Copyright (c) 2018 OSisoft, LLC\n *\n * Released"
},
{
"path": "C/plugins/storage/sqlite/plugin.cpp",
"chars": 14785,
"preview": "/*\n * Fledge storage service.\n *\n * Copyright (c) 2018 OSisoft, LLC\n *\n * Released under the Apache 2.0 Licence\n *\n * Au"
},
{
"path": "C/plugins/storage/sqlite/schema/include/schema.h",
"chars": 3143,
"preview": "#ifndef _SCHEMAS_H\n#define _SCHEMAS_H\n/*\n * Fledge utilities functions for handling stringa\n *\n * Copyright (c) 2022 Dia"
},
{
"path": "C/plugins/storage/sqlite/schema/schema.cpp",
"chars": 21274,
"preview": "/*\n * Fledge storage service.\n *\n * Copyright (c) 2022 Dianomic Systems\n *\n * Released under the Apache 2.0 Licence\n *\n "
},
{
"path": "C/plugins/storage/sqlitelb/CMakeLists.txt",
"chars": 2144,
"preview": "cmake_minimum_required(VERSION 2.6.0)\n\nproject(sqlitelb)\n\nset(CMAKE_CXX_FLAGS_DEBUG \"-O0 -ggdb\")\nset(CMAKE_CXX_FLAGS \"${"
},
{
"path": "C/plugins/storage/sqlitelb/Findsqlite3.cmake",
"chars": 1322,
"preview": "# This CMake file locates the SQLite3 development libraries\n#\n# The following variables are set:\n# SQLITE_FOUND - If the"
},
{
"path": "C/plugins/storage/sqlitelb/common/connection.cpp",
"chars": 94232,
"preview": "/*\n * Fledge storage service.\n *\n * Copyright (c) 2018 OSIsoft, LLC\n *\n * Released under the Apache 2.0 Licence\n *\n * Au"
},
{
"path": "C/plugins/storage/sqlitelb/common/connection_manager.cpp",
"chars": 5223,
"preview": "/*\n * Fledge storage service.\n *\n * Copyright (c) 2017 OSisoft, LLC\n *\n * Released under the Apache 2.0 Licence\n *\n * Au"
},
{
"path": "C/plugins/storage/sqlitelb/common/include/connection.h",
"chars": 6239,
"preview": "#ifndef _CONNECTION_H\n#define _CONNECTION_H\n/*\n * Fledge storage service.\n *\n * Copyright (c) 2018 OSisoft, LLC\n *\n * Re"
},
{
"path": "C/plugins/storage/sqlitelb/common/include/connection_manager.h",
"chars": 1840,
"preview": "#ifndef _CONNECTION_MANAGER_H\n#define _CONNECTION_MANAGER_H\n/*\n * Fledge storage service.\n *\n * Copyright (c) 2017 OSiso"
},
{
"path": "C/plugins/storage/sqlitelb/common/readings.cpp",
"chars": 59848,
"preview": "/*\n * Fledge storage service.\n *\n * Copyright (c) 2018 OSIsoft, LLC\n *\n * Released under the Apache 2.0 Licence\n *\n * Au"
},
{
"path": "C/plugins/storage/sqlitelb/include/common.h",
"chars": 1743,
"preview": "#ifndef _COMMON_CONNECTION_H\n#define _COMMON_CONNECTION_H\n\n#include <sql_buffer.h>\n#include <iostream>\n#include <sqlite3"
},
{
"path": "C/plugins/storage/sqlitelb/include/profile.h",
"chars": 2771,
"preview": "#ifndef _PROFILE_H\n#define _PROFILE_H\n/*\n * Fledge storage service.\n *\n * Copyright (c) 2018 OSisoft, LLC\n *\n * Released"
},
{
"path": "C/plugins/storage/sqlitelb/plugin.cpp",
"chars": 10358,
"preview": "/*\n * Fledge storage service.\n *\n * Copyright (c) 2018 OSisoft, LLC\n *\n * Released under the Apache 2.0 Licence\n *\n * Au"
},
{
"path": "C/plugins/storage/sqlitememory/CMakeLists.txt",
"chars": 1797,
"preview": "cmake_minimum_required(VERSION 2.6.0)\n\nproject(sqlitememory)\n\nset(CMAKE_CXX_FLAGS_DEBUG \"-O0 -ggdb\")\nset(CMAKE_CXX_FLAGS"
},
{
"path": "C/plugins/storage/sqlitememory/Findsqlite3.cmake",
"chars": 1440,
"preview": "# This CMake file locates the SQLite3 development libraries\n#\n# The following variables are set:\n# SQLITE_FOUND - If the"
},
{
"path": "C/plugins/storage/sqlitememory/connection.cpp",
"chars": 5034,
"preview": "/*\n * Fledge storage service.\n *\n * Copyright (c) 2019 OSIsoft, LLC\n *\n * Released under the Apache 2.0 Licence\n *\n * Au"
},
{
"path": "C/plugins/storage/sqlitememory/include/connection.h",
"chars": 2372,
"preview": "#ifndef _CONNECTION_H\n#define _CONNECTION_H\n/*\n * Fledge storage service.\n *\n * Copyright (c) 2018 OSisoft, LLC\n *\n * Re"
}
]
// ... and 2485 more files (download for full content)
About this extraction
This page contains the full source code of the fledge-iot/fledge GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2685 files (13.7 MB), approximately 3.7M tokens, and a symbol index with 9840 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.