Add async read and write files

dev-own-engine
marcelb 8 months ago
parent 4ab7c4af18
commit daec3d7f00
  1. 1
      .gitignore
  2. 3
      .vscode/settings.json
  3. 28
      README.md
  4. 68
      lib/filesystem.hpp
  5. 103
      test/test.cpp

1
.gitignore vendored

@ -1 +1,2 @@
test/test test/test
test/*.txt

@ -27,6 +27,7 @@
"bitset": "cpp", "bitset": "cpp",
"algorithm": "cpp", "algorithm": "cpp",
"string": "cpp", "string": "cpp",
"string_view": "cpp" "string_view": "cpp",
"fstream": "cpp"
} }
} }

@ -14,6 +14,7 @@ A C++ library for event-driven asynchronous multi-threaded programming.
- Typed events (on, emit, off) - Typed events (on, emit, off)
- Event loops - Event loops
- Multiple parallel execution loops - Multiple parallel execution loops
- Asynchronous file IO
## Installation ## Installation
Just download the latest release and unzip it into your project. Just download the latest release and unzip it into your project.
@ -25,6 +26,8 @@ Just download the latest release and unzip it into your project.
#include "asynco/lib/event.hpp" // event #include "asynco/lib/event.hpp" // event
#include "asynco/lib/rotor.hpp" // interval, timeout #include "asynco/lib/rotor.hpp" // interval, timeout
#include "asynco/lib/runner.hpp" // for own loop #include "asynco/lib/runner.hpp" // for own loop
#include "asynco/lib/filesystem.hpp"// for async read and write files
using namespace marcelb; using namespace marcelb;
``` ```
@ -224,6 +227,31 @@ myclass.on("constructed", [] (int i) {
}); });
``` ```
Asynchronous file IO
```c++
string data_;
asynco_read("test.txt", [&data_] (string data, exception* error) {
if (error) {
cout << "Error " << error->what() << endl;
} else {
cout << "Data " << endl << data << endl;
data_ = data;
cout << "Data_" << data_ << endl;
}
});
asynco_write("test1.txt", "Hello night", [] (exception* error) {
if (error) {
cout << "Error " << error->what() << endl;
} else {
cout << "Write successfuly" << endl;
}
});
```
## License ## License
[APACHE 2.0](http://www.apache.org/licenses/LICENSE-2.0/) [APACHE 2.0](http://www.apache.org/licenses/LICENSE-2.0/)

@ -0,0 +1,68 @@
#ifndef _ASYNCO_FS_
#define _ASYNCO_FS_
#include "asynco.hpp"
#include <fstream>
#include <iostream>
using namespace std;
namespace marcelb {
/**
* Asynchronous file reading
*/
template<typename Callback>
void asynco_read(string path, Callback&& callback) {
asynco( [&path, callback] () {
string content;
try {
string line;
ifstream file (path);
if (file.is_open()) {
line.clear();
while ( getline (file,line) ) {
content += line + "\n";
}
file.close();
}
else {
throw runtime_error("Unable to open file");
}
callback(content, nullptr);
} catch(exception& error) {
callback(content, &error);
}
});
}
/**
* Asynchronous file writing
*/
template<typename Callback>
void asynco_write(string path, string content, Callback&& callback) {
asynco( [&path, &content, callback] () {
try {
ofstream file (path);
if (file.is_open()) {
file << content;
file.close();
}
else {
throw runtime_error("Unable to open file");
}
callback(nullptr);
} catch(exception& error) {
callback(&error);
}
});
}
}
#endif

@ -1,8 +1,9 @@
#define NUM_OF_RUNNERS 2 #define NUM_OF_RUNNERS 2
#include "../lib/asynco.hpp" // #include "../lib/asynco.hpp"
#include "../lib/event.hpp" // #include "../lib/event.hpp"
#include "../lib/rotor.hpp" // #include "../lib/rotor.hpp"
#include "../lib/filesystem.hpp"
#include <iostream> #include <iostream>
#include <unistd.h> #include <unistd.h>
@ -11,29 +12,29 @@ using namespace std;
using namespace marcelb; using namespace marcelb;
using namespace this_thread; using namespace this_thread;
void sleep_to (int _time) { // void sleep_to (int _time) {
promise<void> _promise; // promise<void> _promise;
timeout t( [&]() { // timeout t( [&]() {
_promise.set_value(); // _promise.set_value();
}, _time); // }, _time);
return _promise.get_future().get(); // return _promise.get_future().get();
} // }
void promise_reject (int _time) { // void promise_reject (int _time) {
promise<void> _promise; // promise<void> _promise;
timeout t( [&]() { // timeout t( [&]() {
try { // try {
// simulate except // // simulate except
throw runtime_error("Error simulation"); // throw runtime_error("Error simulation");
_promise.set_value(); // _promise.set_value();
} catch (...) { // } catch (...) {
_promise.set_exception(current_exception()); // _promise.set_exception(current_exception());
} // }
}, _time); // }, _time);
return _promise.get_future().get(); // return _promise.get_future().get();
} // }
void notLambdaFunction() { void notLambdaFunction() {
cout << "Call to not lambda function" << endl; cout << "Call to not lambda function" << endl;
@ -48,15 +49,15 @@ class clm {
// ------------------ EXTEND OWN CLASS WITH EVENTS ------------------- // ------------------ EXTEND OWN CLASS WITH EVENTS -------------------
class myOwnClass : public event<int> { // class myOwnClass : public event<int> {
public: // public:
myOwnClass() : event() {}; // myOwnClass() : event() {};
}; // };
int main () { int main () {
auto start = rtime_ms(); // auto start = rtime_ms();
// --------------- TIME ASYNCHRONOUS FUNCTIONS -------------- // --------------- TIME ASYNCHRONOUS FUNCTIONS --------------
@ -64,22 +65,22 @@ int main () {
* Init interval and timeout; clear interval and timeout * Init interval and timeout; clear interval and timeout
*/ */
interval( [&] () { // interval( [&] () {
cout << "interval " << rtime_ms() - start << endl; // cout << "interval " << rtime_ms() - start << endl;
}, 200); // }, 200);
interval( [&] () { // interval( [&] () {
cout << "interval " << rtime_ms() - start << endl; // cout << "interval " << rtime_ms() - start << endl;
}, 200); // }, 200);
interval( [&] () { // interval( [&] () {
cout << "interval " << rtime_ms() - start << endl; // cout << "interval " << rtime_ms() - start << endl;
}, 200); // }, 200);
interval( [&] () { // interval( [&] () {
cout << "interval " << rtime_ms() - start << endl; // cout << "interval " << rtime_ms() - start << endl;
}, 200); // }, 200);
// interval inter1 ([&]() { // interval inter1 ([&]() {
// cout << "interval prvi " << rtime_ms() - start << endl; // cout << "interval prvi " << rtime_ms() - start << endl;
@ -274,6 +275,28 @@ int main () {
// cout << "Constructed " << i << endl; // cout << "Constructed " << i << endl;
// }); // });
// string data_;
// asynco_read("test.txt", [&data_] (string data, exception* error) {
// if (error) {
// cout << "Error " << error->what() << endl;
// } else {
// cout << "Data " << endl << data << endl;
// data_ = data;
// cout << "Data_" << data_ << endl;
// }
// });
// asynco_write("test1.txt", "Hello night", [] (exception* error) {
// if (error) {
// cout << "Error " << error->what() << endl;
// } else {
// cout << "Write successfuly" << endl;
// }
// });
cout << "Sleep" << endl;
sleep(100000); // only for testing sleep(100000); // only for testing
return 0; return 0;

Loading…
Cancel
Save