diff --git a/libs/main/thread/piprotectedvariable.h b/libs/main/thread/piprotectedvariable.h new file mode 100644 index 00000000..c5bc2b01 --- /dev/null +++ b/libs/main/thread/piprotectedvariable.h @@ -0,0 +1,60 @@ +/*! \file piprotectedvariable.h + * \ingroup Thread + * \~\brief + * \~english Thread-safe variable + * \~russian Потокобезопасная переменная + */ +/* + PIP - Platform Independent Primitives + Thread-safe variable + Ivan Pelipenko peri4ko@yandex.ru, Stephan Fomenko, Andrey Bychkov work.a.b@yandex.ru + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ + +#ifndef PIPROTECTEDVARIABLE_H +#define PIPROTECTEDVARIABLE_H + +#include "pimutex.h" + + +template +class PIP_EXPORT PIProtectedVariable { +public: + void set(const T & v) { + PIMutexLocker _ml(mutex); + var = v; + } + void set(T && v) { + PIMutexLocker _ml(mutex); + var = std::move(v); + } + T get() const { + PIMutexLocker _ml(mutex); + return var; + } + T & lock() { + mutex.lock(); + return var; + } + void unlock() { mutex.unlock(); } + + +private: + mutable PIMutex mutex; + T var; +}; + + +#endif diff --git a/libs/main/thread/pithreadmodule.h b/libs/main/thread/pithreadmodule.h index e4e0733d..b9a98069 100644 --- a/libs/main/thread/pithreadmodule.h +++ b/libs/main/thread/pithreadmodule.h @@ -55,6 +55,7 @@ #include "pigrabberbase.h" #include "pimutex.h" #include "pipipelinethread.h" +#include "piprotectedvariable.h" #include "pispinlock.h" #include "pithread.h" #include "pithreadnotifier.h" diff --git a/main.cpp b/main.cpp index 764a1f9d..38593865 100644 --- a/main.cpp +++ b/main.cpp @@ -8,12 +8,50 @@ #include "pilog.h" #include "pimathbase.h" #include "pip.h" +#include "piprotectedvariable.h" #include "pitranslator_p.h" #include "pivaluetree_conversions.h" using namespace PICoutManipulators; +class MyStr: public PIString { +public: + MyStr(): PIString() {} + MyStr(const char * o): PIString(o) { piCout << "MyStr *"; } + MyStr(const MyStr & o): PIString(o) { piCout << "MyStr &"; } + // MyStr(const MyStr & o): PIString(o) { piCout << "MyStr &"; } + MyStr(MyStr && o): PIString(o) { piCout << "MyStr &&"; } + MyStr & operator=(const MyStr & o) { + *this += o; + piCout << "MyStr =&"; + return *this; + } + MyStr & operator=(MyStr && o) { + *this += o; + piCout << "MyStr =&&"; + return *this; + } +}; + + int main(int argc, char * argv[]) { + PIProtectedVariable var; + // MyStr s("hello"); + var.set("hello"); + auto & v = var.lock(); + // v = "world"; + var.unlock(); + piCout << var.get(); + + /*PICodeParser parser; + parser.parseFile("client_server.h"); + for (auto m: parser.enums) { + piCout << ""; + piCout << m.name; // << m.args << m.value; + // piCout << m.expand({"hello"}); + }*/ + + return 0; PITranslator::loadLang("ru"); PISerial f("COM123"); f.open(); @@ -47,14 +85,6 @@ int main(int argc, char * argv[]) { piCout << "hello!"_tr("Co") << "hello!"_tr;*/ // piCout << "hello!"_trNoOp; - // PICodeParser parser; - // parser.parseFile("cmg_test.h"); - /*for (auto m: parser.macros) { - piCout << ""; - piCout << m.name << m.args << m.value; - piCout << m.expand({"hello"}); - } -*/ /*PISet set; piCout << set << piSerialize(set) << piDeserialize>(piSerialize(set));