From da9a91794545982793a987a277fe15228ac2b7b2 Mon Sep 17 00:00:00 2001 From: marcelb Date: Mon, 8 Jan 2024 19:39:22 +0100 Subject: [PATCH] License, Readme, comments --- LICENSE | 2 +- README.md | 61 ++++++++++++++++++++++++++++++++++++++++++++++++ lib/metrics.hpp | 29 +++++++++++++++-------- test/test | Bin 83872 -> 92120 bytes test/test.cpp | 20 ++++++++++++++-- 5 files changed, 99 insertions(+), 13 deletions(-) diff --git a/LICENSE b/LICENSE index 4042734..c06f6b3 100644 --- a/LICENSE +++ b/LICENSE @@ -58,7 +58,7 @@ APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. -Copyright [2023] [Marcel Bandić] +Copyright [2023] [Marcel Bandić - marcelb96@yahoo.com] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.md b/README.md index e69de29..dcf224d 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,61 @@ + +# A library for tracking statistics and metrics + +A simple library for measuring incremental parameters in C++ programs based on the key-value principle. + +## Features + +- Object oriented +- Thread safe +- Easy access to counters using the [] operator +- Simple incrementing of counters using the ++ operator +- Initial setup of the list of counters and values +- List of counter names +- Retrieving the status of all counters +- Reset all counters +- Retrieving the state of all counters and resetting the counters +## Installation + +Just download the latest release and unzip it into your project. You can turn it on with: + +``` +#include "metrics/lib/metrics.hpp" +using namespace marcelb; +``` + +## Usage + +```c++ +// init +Metrics stats; +// operator [] and increment ++ +stats["access"]++; +// print couter access +cout << stats["access"]; +// get counters names +auto listCounterNames = stats.keys(); +// get all couters +auto data = stats.get_data(); +// reset counters +stats.clear(); +// set counters +map MyStats = {{"access", 3},{ "error", 0}}; +stats.set(MyStats); +// get and clear all counters +auto dataWithClear = stats.get_data_and_clear(); +``` +## License + +[APACHE 2.0](http://www.apache.org/licenses/LICENSE-2.0/) + + +## Support & Feedback + +For support and any feedback, contact the address: marcelb96@yahoo.com. + +## Contributing + +Contributions are always welcome! + +Feel free to fork and start working with or without a later pull request. Or contact for suggest and request an option. + diff --git a/lib/metrics.hpp b/lib/metrics.hpp index a580079..f75130c 100644 --- a/lib/metrics.hpp +++ b/lib/metrics.hpp @@ -11,28 +11,34 @@ using namespace std; namespace marcelb { - /** - * Klasa za mjerenje proizvoljne statistike - */ - +/** + * A class for measuring arbitrary statistics +*/ class Metrics { mutex io; map counters; public: + /** + * Constructor, without predefining the name of the counter + */ Metrics (); + + /** + * Constructor, with predefined counters from the passed object + */ Metrics (map _counters); /** - * Operator[] za pristup svakoj brojaču mjerenja + * Operator[] to access each measurement counter */ uint& operator[](const string& key) { return counters[key]; } /** - * Operator++ za inkrementalno povećanje brojača mjerenja + * Operator++ to increment the measurement counter incrementally */ Metrics& operator++ (int n) { lock_guard _io(io); @@ -40,27 +46,30 @@ class Metrics { return *this; } + /** + * Method to set the counter from the passed object + */ void set(map _counters) { counters = _counters; } /** - * Metoda za resetiranje brojača + * A method to reset the counter */ void clear(); /** - * Metoda koja vraća vektor stringova svih naziva brojača + * A method that returns a vector os strings of all counter names */ vector keys(); /** - * Metoda vraća map svih mjerenja + * The method returns a map of all measurements */ map get_data(); /** - * Metoda vraća map svih mjerenja i resetira brojače + * The method returns a map of all measurements and resets the counters */ map get_data_and_clear(); diff --git a/test/test b/test/test index 37336007b3b97a1be69e47d9fa9c51776b6ad441..db2161a63f4f277b80ee82d5ea40a54b801aa688 100755 GIT binary patch literal 92120 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 diff --git a/test/test.cpp b/test/test.cpp index cc0fa24..19ce70b 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -16,7 +16,23 @@ int main() { cout << " error " << metrika["error"] << endl; cout << " access " << metrika["access"] << endl; - + // // init + // Metrics stats; + // // operator [] and increment ++ + // stats["access"]++; + // // print couter access + // cout << stats["access"]; + // // get counters names + // auto listCounterNames = stats.keys(); + // // get all couters + // auto data = stats.get_data(); + // // reset counters + // stats.clear(); + // // set counters + // map MyStats = {{"access", 3},{ "error", 0}}; + // stats.set(MyStats); + // // get and clear all counters + // auto dataWithClear = stats.get_data_and_clear(); return 0; -} \ No newline at end of file +}